【问题标题】:Include external DLL within the project's build in VS 2013在 VS 2013 中的项目构建中包含外部 DLL
【发布时间】:2014-05-27 06:19:35
【问题描述】:

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

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

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

谢谢,希望不要太混乱:)

【问题讨论】:

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


【解决方案1】:

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

  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。

试试

Assembly.Load("SolutionBDLL")

【讨论】:

  • thx,使用 ILmerge 并尝试创建一个最终工作的构建后脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多