2014-04-13 54 views
0

我在VS 2013(c#)中有2个解决方案,SolutionA包含网站等,SolutionB包含像密码生成器等常用逻辑(我也用于其他解决方案)。在VS 2013项目的内部包含外部DLL

SolutionB使用外部Bcrypt DLL(等)。但是,当我在SolutionA中包含来自SolutionB的项目/ dll的引用时,我需要手动引用SolutionB中使用的dll。所以我的SolutionA仍然需要对Bcrypt DLL的引用......尽管这只用于SolutionB代码。

如何将此外部Bcrypt dll包含到由SolutionB构建的dll中,因此我不需要在SolutionA中引用其他任何内容,但我自己的SolutionB dll是?

谢谢,希望这不是太混乱:)

+0

http://blogs.msdn.com/b/saurabh_singh/archive/2009/04/08/unable-to-load-dll-bcrypt-dll-the-specified-module -could-not-found-exception-from-hresult-0x8007007e.aspx –

回答

-1

有像ILMerge /自定义工具等各种选项中嵌入一个DLL到另一个。这里是一个CODE的方式:

  1. 在解决方案B中,转到BCrypt.dll并在属性中执行'copy local' = false
  2. 添加DLL作为解决方案的一部分。 (如果还没有)
  3. 将BCrypt.dll的生成操作设置为Embedded Resource
  4. 现在在入口点/启动B溶液DLL的代码,订阅AssemblyResolve事件如下:

5.

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
{ 
string dllName = args.Name + ".dll";  

using (var stream= Assembly.GetExecutingAssembly().GetManifestResourceStream(dllName)) 
{ 
    byte[] assemblyData = new byte[stream.Length]; 
    stream.Read(assemblyData, 0, stream.Length); 

    return Assembly.Load(assemblyData); 
} 
}; 
  1. 基本上我们所做的是嵌入式Bcrypt.dll到解决方案B的DLL中,这样当解决方案B的dll被引用时,我们也有可用的BCrypt.dll。
  2. 而当.NET程序集解析失败,上述事件引发任何自定义程序集加载,我们提供我们的BCrypt的地址到流程。

如果Assembly.GetExecutingAssembly()不起作用,它可能试图在解决方案A的资源流中搜索BCrypt。

尝试

​​
+0

thx,使用ILmerge并试图创建一个最终能够工作的postbuild脚本。 – user2713516

相关问题