【问题标题】:Is it possible to internalize/IL-merge a single C# class?是否可以内部化/IL 合并单个 C# 类?
【发布时间】:2018-02-10 12:03:44
【问题描述】:

我有一个应用程序引用了一个相当大的库 DLL(我们称之为lib.dll),但它只使用其中的一个类(我们称之为Helper)。

lib.dll 有额外的传递引用,它们在编译时都复制到我的项目的bin 文件夹中。

我很想避免这种开销,并找到一种方法将构成 Helper 的代码“复制”或“交叉编译”或“合并”到我的主项目中。

有没有这样做的可能性?我想避免整个 IL 合并 lib.dll

【问题讨论】:

  • 如果HelperClass 也与其他类或程序集有一些依赖关系怎么办?这会使这个问题变得相当复杂。在最坏的情况下,您最终还是要将整个程序集及其所有依赖项复制到您的程序中。
  • @HimBromBeere 你是对的,但就我而言,它确实是一个简单的类。
  • @close-voters:“太宽泛”我可以反驳。 “不清楚” => 请具体说明?
  • 开销?什么开销? .NET 程序集强烈支持按需分页的虚拟内存操作系统提供的“不用为不用的东西付费”范式。对整洁的渴望是一个很好的程序员特质,但这适用于源代码,而不是字节。
  • @HansPassant 也许开销是一个糟糕的词选择,但我所说的开销在于部署。当然,我们有自动化系统等,所以这里没有真正的问题,但我只是想知道是否可以消除我不需要需要的 10 个额外的 dll/pdb 文件.

标签: c# .net dependencies .net-assembly ilmerge


【解决方案1】:

在某些情况下,您可以将第三方 dll 作为嵌入式资源嵌入并自行解析引用,正如 Jeffrey Richter 所述 here

简而言之,在您的入口点:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    string name = new AssemblyName(args.Name).Name;

    // Either hardcode the appropriate namespace or retrieve it at runtime in a way that makes sense for your project.
    string resourceName = string.Concat("My.Namespace.Resources.", name, ".dll");

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

        return Assembly.Load(buffer);
    }
};

【讨论】:

  • 有趣。与让 CLR(JIT?)只做它的事情相比,它的性能如何。程序集加载?
  • 老实说,我只使用过一次这种技术:我有一个启动屏幕,它也用作 zip 文件提取器,我厌倦了随它一起提供 Ionic.Zip.dll。我无法检测到任何重大的性能下降,但我只解析了一个 dll,没有其他引用的 dll。
  • 另外,我更新了代码以修复复制/粘贴问题,其中我省略了必要的变量声明。
【解决方案2】:

如果您使用的是 .NET Core,则可以选择新的 .NET Linker。否则,许可许可,并且如果您使用的类没有太多依赖项并且 dll 没有被混淆,您可以通过使用 IL Spy 反编译 dll 来将代码复制到您的应用程序

【讨论】:

  • 链接器看起来非常有趣!我同意仅复制代码是一种选择,但就我而言,我可以访问实际源代码并希望将其专门维护在原处,因为lib.dll 散布在其他地方。
  • 我只是建议 Mono Linker,.NET LInker 实际上是基于它的。也许这也可以与完整的 .NET 程序集一起使用。 github.com/mono/linker
  • 如果你可以访问代码,并且它在同一个仓库中,另一个版本是在你的项目中链接文件
  • @AkosNagy 我也看到了单声道链接器,不确定它是在维护还是被 .NET 链接器取代
  • @TitianCernicova-Dragomir 不幸的是它不在同一个仓库中,否则我肯定会使用文件链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多