如何将引用的库打包到新库中

时间:2013-06-04 20:53:40

标签: c# visual-studio dll

在创建新库MyAPI.dll时,我引用了许多其他(非标准)库,例如RestSharp.dllNewtonsoft.dllMyUtilities.dll等。我的库有效我的开发环境很好,因为我已经下载了所有其他库,并且它们位于我的项目的bin文件夹中,但是一旦我尝试发布该库并在新位置使用它,它就会失败,因为引用的库无法找到。

如何设置我的MyAPI.csproj项目,以便将这些dll /库打包到我发布的.dll文件中,MyAPI.dll的未来用户不必担心下载并引用这些依赖项?

认为这很简单,但我的google-fu今天很弱。将这些外部引用设置为CopyLocal = False会将它们从/bin/目录中删除,从而产生将它们打包到MyAPU.dll中的错觉,但实际上Visual Studio只是将它们添加到我的全局程序集缓存(GAC)中,这对API的未来用户没有帮助。

3 个答案:

答案 0 :(得分:4)

有两种选择(据我所知):

  1. ILMerge
  2. Embeded Resource和Assembly.Resolve(请参阅Jeffrey Richter
  3. 首先,你可以使用ILMerge,它是可以将多个.NET程序集合并在一起的comamndline程序,创建一个输出文件。它无法合并WPF项目。可以添加到postbuild事件以自动合并。

    其次是将库作为嵌入资源添加到项目中,然后注册到Assembly.Resolve event并在需要时从资源加载程序集。 Jeffrey Richter关于这种方法的文章:Jeffrey Richter

    第二种方法有一个主要缺点,它不能将多个库合并为一个(它只能用于将库添加到可执行文件中),至少在c#中没有其他工具。要将库添加到库,您必须使用另一个工具,这在第二页的Jeffrey的文章评论中提到:(Module initializer injection)。将库嵌入到其他库中的问题是您不能(至少在c#中)注册在需要嵌入库之前的Assembly.Resolve事件,因此您需要使用Module initializer injection注入模块初始值设定项。它也可以设置为构建事件,使用该工具写在apge上。这可能听起来很复杂,但一旦你设置它很容易。

答案 1 :(得分:3)

有一个免费的nuget软件包“Costura.Fody”它将依赖项程序集作为资源打包到程序集中。该解决方案适用于WPF和其他托管程序集。

如果依赖项程序集不在执行文件夹中,则会自动执行打包程序集。它还会自动配置您的msbuild目标,以便在构建期间打包依赖项。您不必在程序集中添加代码。 它还允许您配置要在xml文件中打包的程序集。

它使用两种方法的组合:

  • Jeffrey Richter建议使用嵌入式资源作为合并程序集的方法。
  • Einar Egilsson建议使用cecil创建模块初始化器。

您可以在此处找到文档:https://github.com/Fody/Costura/blob/master/README.md

答案 2 :(得分:0)

它不是免费的(有一个试用版),但我的一个朋友告诉我一个名为.NET Reactor的程序,它能够将依赖DLL的exe打包成一个可执行文件,值得一看。

我想说下一个最直接的选择是ClickOnce,a good tutorial is here