在VS 2013中的项目构建中包含外部DLL

时间:2014-04-13 08:36:33

标签: c# .net visual-studio dll build

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

SolutionB使用外部Bcrypt dll(以及其他)。但是,当我在SolutionA中包含对SolutionB中的projects / dll的引用时,我需要手动引用SolutionB中使用的dll。所以我的SolutionA仍然需要对Bcrypt DLL的引用...即使这只是在SolutionB代码中使用。

如何将这个外部Bcrypt dll包含在从SolutionB构建的dll中,所以我不需要在SolutionA中引用任何其他内容,而是我自己的SolutionB dll?

谢谢,希望它不会太混乱:)。

1 个答案:

答案 0 :(得分:-1)

有各种选项,如 ILMerge /自定义工具等,可以将一个DLL嵌入到另一个DLL中。这是一种CODE方式:

  1. 在解决方案B中,转到BCrypt.dll并在属性中执行'copy local' = false
  2. 添加DLL作为解决方案的一部分。 (如果还没有)
  3. 将BCrypt.dll的构建操作设置为Embedded Resource
  4. 现在,在解决方案B DLL的入口点/启动代码中,订阅AssemblyResolve事件,如下所示:
  5. 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嵌入到Solution B的DLL中,这样当引用Solution B的dll时,我们也可以使用BCrypt.dll。
    2. 当.NET程序集解析失败时,会针对任何自定义程序集加载引发上述事件,并向流程提供BCrypt的地址。
    3. 如果Assembly.GetExecutingAssembly()上面不起作用,它可能会尝试在解决方案A的资源流中搜索BCrypt。

      尝试

      Assembly.Load("SolutionBDLL")