在创建新库MyAPI.dll
时,我引用了许多其他(非标准)库,例如RestSharp.dll
,Newtonsoft.dll
,MyUtilities.dll
等。我的库有效我的开发环境很好,因为我已经下载了所有其他库,并且它们位于我的项目的bin文件夹中,但是一旦我尝试发布该库并在新位置使用它,它就会失败,因为引用的库无法找到。
如何设置我的MyAPI.csproj
项目,以便将这些dll /库打包到我发布的.dll
文件中,MyAPI.dll
的未来用户不必担心下载并引用这些依赖项?
认为这很简单,但我的google-fu今天很弱。将这些外部引用设置为CopyLocal = False
会将它们从/bin/
目录中删除,从而产生将它们打包到MyAPU.dll中的错觉,但实际上Visual Studio只是将它们添加到我的全局程序集缓存(GAC)中,这对API的未来用户没有帮助。
答案 0 :(得分:4)
有两种选择(据我所知):
首先,你可以使用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文件中打包的程序集。
它使用两种方法的组合:
您可以在此处找到文档:https://github.com/Fody/Costura/blob/master/README.md
答案 2 :(得分:0)
它不是免费的(有一个试用版),但我的一个朋友告诉我一个名为.NET Reactor的程序,它能够将依赖DLL的exe打包成一个可执行文件,值得一看。
我想说下一个最直接的选择是ClickOnce,a good tutorial is here。