【问题标题】:Static Linking of libraries created on C# .NET在 C# .NET 上创建的库的静态链接
【发布时间】:2009-12-08 17:15:52
【问题描述】:

我正在使用 VS2008 C#.NET。

我在 3 个项目中创建了 3 个不同类别的库。我编写了一个使用这些库(dll)的应用程序。

正在发生的事情是每个项目都在编译成一个类库。所以,我有 3 个 dll 和 1 个 exe。

相反,我想通过两种方式获得这些:

  1. 仅包含 3 个和 1 个 exe 的类库程序集 (dll)。
  2. 只有一个 EXE(里面的所有内容) :: 静态链接。

我怎么能这样做?我在 VS2008 中找不到任何静态链接选项,也请提及命令行选项。

【问题讨论】:

    标签: c# .net visual-studio-2008


    【解决方案1】:

    ILMerge 是你所追求的。

    我不确定我是否真的称之为“静态链接”——它只是将几个程序集合并为一个。 (特别是,请不要以为这是在构建本机的、非托管的可执行文件。)但是,我认为这是您所追求的 :)

    更新:ILMerge 现在是open source,也可以作为NuGet package 使用:

    Install-Package ilmerge 
    

    【讨论】:

    • 我相信在 *nix 领域,不依赖于动态加载的共享对象的可执行文件称为“静态链接”
    • 当它只是一个程序集时,将其称为“静态链接”有什么问题?因为所有内容都链接到一个并与我的可执行文件一起(我的意思是它们不共享),并且所有内容也一次加载。
    • @orip:我对静态链接的看法不止于此; .NET 中的链接仍然有些动态 - 在执行时需要修复的内容比静态链接的本机可执行文件要多。
    • @jonskeet 我同意,我一直在搜索整个 stackflow 并且所有 .netters 都认为 ilmerge 是静态链接的。静态链接的目标(包括在 c/c++ 和编译时代的 Windows 中)始终是拥有一个完全不需要其他东西的独立 exe ......我最好重复一遍:除了有问题的 exe 之外,别无其他.不需要或假定一个其他 dll。
    • @kdmurray:根据我的回答,您可以创建一个不依赖 .NET 运行时的单个 .NET 程序集。
    【解决方案2】:

    您可以将所有代码放入一个 EXE 项目中,使用第三方链接器(谷歌 .net 静态链接器有很多选项),或者使用 ILMerge 作为illustrated here

    第三方链接器一般也提供代码混淆功能,有些还可以静态链接.NET Framework。

    【讨论】:

      【解决方案3】:

      偶然发现了这个问题,并从 Jeffrey Richter (http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx) 那里找到了实现这些目的的另一种方法:您可以将 .dll 作为资源嵌入到可执行文件中,然后重载 AssemblyResolve 事件以加载程序集方式。引用链接中的代码:

      AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
         String resourceName = "AssemblyLoadingAndReflection." +
            new AssemblyName(args.Name).Name + ".dll";
         using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
            Byte[] assemblyData = new Byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
         }
      };
      

      【讨论】:

      • 链接已失效。是否支持外部 DLL?
      【解决方案4】:

      关于Jon Skeet's 的答案,ILRepack 也是一个很好的open-source 替代 ILMerge。您可以通过以下方式从 NuGet 安装它:

      Install-Package ILRepack
      

      【讨论】:

        【解决方案5】:

        您还应该看看ILMERGE-GUI。它是 ILMerge 的 GUI 包装器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          • 2021-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多