【问题标题】:how to merge dll's into one dll如何将dll合并为一个dll
【发布时间】:2017-08-07 16:36:13
【问题描述】:

在 Visual Studio 2012 中使用 c#,我创建了一个类库 FileTube.dll 它使用 3 个其他 dll。 我想制作一个 dll 来包含那些,因此我可以通过 nuget 发布我的库。 我尝试了 3 种方法都失败了:

方法 1: 在视觉工作室中,我将“嵌入互操作程序集”设置为 true,我收到此错误:

Error   2   Cannot embed interop types from assembly 'DiffieHellman.dll' because it is missing the 'GuidAttribute' attribute    DiffieHellman.dll

方法 2: 我使用了 ILMergeGUI。它生成了用于 ILMerge 的代码,该代码因错误而失败: 你调用的对象是空的。 这是命令:

"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/ndebug
/copyattrs
/targetplatform:4.0,"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/out:"C:\temp\z.dll"
"C:\\FileTube\TestApp\bin\Debug\FileTube.dll"
"C:\\FileTube\TestApp\bin\Debug\DiffieHellman.dll"
"C:\\FileTube\TestApp\bin\Debug\Org.Mentalis.Security.dll"
"C:\\FileTube\TestApp\bin\Debug\Tamir.SharpSSH.dll"

方法 3: 我关注了这个tutorial 使用反射来包含 dll 程序集。不同之处在于本教程有一个主要的可执行文件,并且在我试图在我的 dll 中包含 dll 时在可执行文件中包含 dll。所以我将反射代码添加到我的主 dll 的类构造函数中。它可以编译,但如果我重命名该外部 dll,它会失败,这意味着它并没有真正加载它。

有什么想法吗?

【问题讨论】:

  • 这个想法是有一个引用另一个 nuget 包的 nuget 包。让 nuget 解析引用,而不是试图超越它。
  • 您将不得不启动 ILMerge 命令。没有足够的面包屑,但请注意您正在这样做dangerously wrong
  • 为什么要将 DLL 合并到一个 DLL 中。只需将它们合并到可执行文件中即可。我认为 ILMerge 期望输出是 exe,而不是 DLL。还要删除路径中的双反斜杠,它很挑剔并且不能很好地处理异常。例如,如果你给它的路径中有空格,当前版本的 ILMerge 将抛出相同的错误。 (顺便说一句,我将相同的 tamir.sharpSS.dll 合并到我的可执行文件中,ILMerge 可以完美运行。但我将它合并到可执行文件 (.exe) 中,而不是另一个 DLL。
  • 我的目标是制作一个 dll 并与其他开发人员共享。这样,他们可以在本地使用它,但不能在其代码中本地使用可执行文件。

标签: c# dll


【解决方案1】:

您有多种选择:

  • 使用SmartAssembly(商业)等工具
    它可以嵌入和合并其他内容(无需更改源代码)

  • code that yourself in less than 10 lines(免费但最小的源代码更改)
    将所有需要的依赖项标记为“嵌入式资源” - 这样它们就包含在 EXE 文件中...您需要设置一个 AssemblyResolve 处理程序,该处理程序在运行时从资源中读取并将所需的 DLL 返回到 .NET 运行时...

(答案复制自:How to merge multiple assemblies into one?

【讨论】:

  • 第三个选项只对exe有效,对dll无效。
  • 正确。感谢您的补充:)
  • 继续使用 .NET 5.0,ILRepack 是 ILMerge 的替代品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多