【问题标题】:Linking statically in C#在 C# 中静态链接
【发布时间】:2008-09-02 09:44:16
【问题描述】:

我正在为 CMS 开发一个模块。该模块作为类库 DLL 分发。

我想在这个模块中使用几个实用程序库。无论如何我可以静态链接这些库,这样我就不必分发多个 DLL(从而分别分发我的实用程序库)?

我希望只有一个 DLL。

【问题讨论】:

    标签: c# visual-studio-2008 linker


    【解决方案1】:

    您可以使用 ILMERGE 合并您的许多 DLL:

    http://research.microsoft.com/~mbarnett/ILMerge.aspx

    我自己没试过。希望对您有所帮助。


    在此处下载:
    http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

    简要说明 (来自下载页面)
    ILMerge 是一个用于将多个 .NET 程序集合并为一个 .NET 程序集的实用程序。它适用于可执行文件和 DLL,并带有几个用于控制输出处理和格式的选项。有关详细信息,请参阅随附的文档。

    【讨论】:

    • 正如 Seb 所说,ILMERGE 会执行此操作 - 但需要注意的是,任何程序集都不能包含不安全的代码。
    • 不安全的代码就好了。它不会处理混合模式程序集。包含非托管代码并由 C++/CLI 项目创建的类型。
    【解决方案2】:

    如果您不想使用 ILMerge,请参阅此页面:

    http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

    编者注:Jeffrey Richter 建议将您的 dll 作为资源放入 exe 文件中(对于您添加的每个 DLL 文件,显示其属性并将其“构建操作”更改为“嵌入式资源” 。”)。然后需要一个自定义类加载器来使可执行文件工作(在运行时,CLR 将无法找到依赖的 DLL 程序集,这是一个问题。要解决这个问题,当您的应用程序初始化时,注册一个回调AppDomain 的 ResolveAssembly 事件的方法)。

    请务必更改resourceName 字符串以指向您的实际资源。 (例如,将 AssemblyLoadingAndReflection 更改为您的项目名称。)

    【讨论】:

    • 好多了!第三方工具的 Nativ 解决方案。请查看评论部分以获取 ILMerge 创建者的评论...
    • 虽然这需要一些额外的努力,但这似乎是比公认答案更好的解决方案。
    【解决方案3】:

    对此的简短回答是否定的! 您不能在编译期间链接到 dll。 我不知道是否有一些微妙的方法可以做到这一点,但您可能必须将 dll 与您的 cms 一起分发。 做到这一点的最好方法是进行某种可再分发。

    【讨论】:

    • 不正确。看看卡加玛的回答。另请查看评论部分以获取 Mike Barnett 的评论。
    • @Kobor42:错了,这不是链接这是合并。虽然投票最多的答案回答了问题的意图(因此是最有用的答案),但 khebbie 的答案实际上是正确的,只要有人能准确回答所提出的问题。你甚至不能在 C/C++ 中链接一个 dll,你需要一个静态存档来做到这一点......
    • 这个在技术上是正确的答案没有任何赞成票,这很有趣。 C# 是一种托管语言,甚至 ILMerge 也是一种程序集合并器,而不是链接器。正如 C++ 和 C 开发人员所理解的那样,链接器当前不能像当前存在的那样存在于 .NET 中。然而,尚未在 2015 年年中发布的“.Net native”技术可能有一天会发布,它允许完全编译(不再有 MSIL)应用程序,然后可以静态链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2012-09-30
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多