是否可以内部化/合并单个C#类?

是否可以内部化/合并单个C#类?,c#,.net,dependencies,.net-assembly,ilmerge,C#,.net,Dependencies,.net Assembly,Ilmerge,我有一个应用程序引用了一个相当大的库DLL(我们称之为lib.DLL),但它只使用其中的一个类(我们称之为Helper) lib.dll具有其他可传递引用,这些引用在编译时都会复制到我的项目的bin文件夹中 我非常希望避免这种开销,并找到一种方法将构成Helper的代码“复制”或“交叉编译”或“合并”到我的主项目中 有没有这样做的可能性?我希望避免IL在其整体上合并lib.dll。如果您使用的是.NET核心,那么新的将是一个选项。否则,在许可证允许的情况下,如果您使用的类没有太多依赖项,并且dl

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

lib.dll
具有其他可传递引用,这些引用在编译时都会复制到我的项目的
bin
文件夹中

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


有没有这样做的可能性?我希望避免IL在其整体上合并
lib.dll

如果您使用的是.NET核心,那么新的将是一个选项。否则,在许可证允许的情况下,如果您使用的类没有太多依赖项,并且dll没有混淆,您可以通过使用

反编译dll将代码复制到应用程序。在某些情况下,您可以将第三方dll嵌入为嵌入资源,并自行解析引用,正如杰弗里·里克特所描述的那样

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

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);
    }
};

如果
HelperClass
对其他类或程序集也有一些依赖性,该怎么办?这将使这个问题变得相当复杂。在最坏的情况下,您最终还是将整个程序集及其所有依赖项复制到您的程序中。@HimBromBeere您是对的,但在我的情况下,它实际上是一个简单的类。@close Vorters:“太宽了”,我可以反驳。“不清楚”=>请指定?开销?什么开销。NET程序集强烈支持按需分页虚拟内存操作系统提供的“不使用就不用付费”范例。“对整洁的渴望是一个很好的程序员特征,但这适用于源代码,而不是字节。@HansPassant也许开销是一个糟糕的词汇选择,但我所说的开销在于部署。当然,我们有自动化系统等,所以这里没有真正的问题,但我只是好奇,如果我可以消除10个额外的dll/pdb文件,我不需要。链接器看起来非常有趣!我同意只复制代码是一种选择,但在我的情况下,我可以访问实际的源代码,并希望特别维护它,因为
lib.dll
分布在其他地方。我只是建议使用.NET链接器所基于的单链接器。也许这也可以用于完整的.NET程序集。如果您可以访问该代码,并且它位于同一个repo中,那么另一个版本将是在您的数据库中链接该文件project@AkosNagy我也看到了mono链接器,不确定它是否被维护,或者是否被.NET取代Linker@TitianCernicova-Dragomir它不在同一回购协议中不幸的是,否则我肯定会使用file linking.interest。与让CLR(JIT?)只进行程序集加载的工作相比,它的性能如何?我只使用过一次这种技术:我有一个启动屏幕,它也可以作为zip文件提取器,我厌倦了将Ionic.zip.dll与它一起提供。我无法检测到性能的任何重大下降,但我只解析了一个dll,没有其他引用的dll。此外,我更新了代码以修复复制/粘贴问题,其中我省略了必要的变量声明。