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

C# 如何将引用的库打包到新库中,c#,visual-studio,dll,C#,Visual Studio,Dll,创建新库MyAPI.dll时,我引用了许多其他非标准库,如RestSharp.dll、Newtonsoft.dll、MyUtilities.dll等。我的库在我的开发环境中运行良好,因为我下载了所有其他库,它们位于我项目的bin文件夹中,但一旦我试图发布该库并在新位置使用它,它就会失败,因为无法找到引用的库 如何设置MyAPI.csproj项目,以便将这些dll/库打包到发布的.dll文件中,并且MyAPI.dll的未来用户不必担心下载和引用这些依赖项 本以为这很简单,但我的google fu今

创建新库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的未来用户没有任何帮助。

它不是免费的,有一个试用版,但我的一个朋友告诉我一个名为的程序,它能够将带有依赖DLL的exe打包到单个可执行文件中,非常值得一看


我想说,下一个最直接的选择是ClickOnce,。

它不是免费的,还有一个试用版,但我的一个朋友告诉我一个名为的程序,它能够将带有依赖DLL的exe打包成单个可执行文件,非常值得一看


我想说下一个最直接的选择是ClickOnce。

据我所知,有两种选择:

嵌入的资源和程序集。解析请参阅 首先您可以使用,这是一个comamndline程序,它可以将多个.NET程序集合并在一起,创建一个输出文件。它不能合并WPF项目。可以添加到生成后事件以使合并自动进行

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


第二种方法有一个主要缺点,它不能将多个库合并成一个库。它只能用于将库添加到可执行文件中,至少在没有其他工具的c语言中是这样。要将库添加到库中,您必须使用另一个工具,这在Jeffrey第二页的文章评论中提到:。将库嵌入到其他库中的问题是,您至少不能在c中注册到程序集。请在需要嵌入库之前解决事件,因此,您需要使用将注册注入到模块初始值设定项。还可以将其设置为build event(生成事件),该事件使用该工具写入apge。这听起来可能很复杂,但一旦你设置好它就很容易了。

据我所知,有两种选择:

嵌入的资源和程序集。解析请参阅 首先您可以使用,这是一个comamndline程序,它可以将多个.NET程序集合并在一起,创建一个输出文件。它不能合并WPF项目。可以添加到生成后事件以使合并自动进行

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


第二种方法有一个主要缺点,它不能将多个库合并成一个库。它只能用于将库添加到可执行文件中,至少在没有其他工具的c语言中是这样。要将库添加到库中,您必须使用另一个工具,这在Jeffrey第二页的文章评论中提到:。将库嵌入到其他库中的问题是,您至少不能在c中注册到程序集。请在需要嵌入库之前解决事件,因此,您需要使用将注册注入到模块初始值设定项。还可以将其设置为build event(生成事件),该事件使用该工具写入apge。这听起来可能很复杂,但一旦你设置好它就很容易了。

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

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

它使用两种方法的组合:

Jeffrey Richter建议使用嵌入式资源作为合并程序集的方法。 Einar Egilsson建议使用cecil创建模块初始值设定项。
您可以在这里找到文档:

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

如果依赖项程序集不在e中 执行文件夹时,打包的组件将自动获取。它还自动配置msbuild目标,以便在生成期间打包依赖项。您不必在程序集中添加代码。 它还允许您配置要在xml文件中打包或不打包的程序集

它使用两种方法的组合:

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

您可以在此处找到文档:

我不知道是否存在潜在的版权侵权,但您可以将这些库与DLL一起分发。假设我只想打包自己的库。为了模块化,我有许多不同的csproj和各种实用程序,我在自己的应用程序中循环使用它们。除了将它们的所有源代码文件复制到一个公共项目中之外,没有办法将它们作为资源链接到某个生产库中?如果是这样,并且所有代码都是我的,我可能会有一个项目将所有文件链接到它中。但这仍然感觉像是一件琐事,我希望有一个更简单的答案。碰巧我想与ExcelDNA XLL外接程序一起发布的特定库可以使用捆绑的ExcelDnaPack实用程序合并到XLL中。话虽如此,我不必求助于下面的任何解决方案,因此我将接受最高评级的解决方案。我不知道是否存在潜在的版权侵权,但您可以将这些库与DLL一起分发。好吧,假设我只想打包我自己的库。为了模块化,我有许多不同的csproj和各种实用程序,我在自己的应用程序中循环使用它们。除了将它们的所有源代码文件复制到一个公共项目中之外,没有办法将它们作为资源链接到某个生产库中?如果是这样,并且所有代码都是我的,我可能会有一个项目将所有文件链接到它中。但这仍然感觉像是一件琐事,我希望有一个更简单的答案。碰巧我想与ExcelDNA XLL外接程序一起发布的特定库可以使用捆绑的ExcelDnaPack实用程序合并到XLL中。也就是说,我不必求助于下面的任何解决方案,所以我会接受最高评级的解决方案。不构建可执行或WPF应用程序,所以这些都不适用。当然.net reactor仍然适用?这个文档文件似乎有很多我要找的关键字,但似乎都需要构建到可执行文件中。此外,程序混淆的主要目的与我的目的相反,我的目的是创建一个任何人都可以使用的公共API.dll。模糊处理过程会将它从.NET程序集转换为本机程序集,从而限制了它的可用性。没问题,@Krtek似乎能够为您指明正确的方向:不构建可执行程序或WPF应用程序,所以这些都不适用。当然.net reactor仍然适用吗?这个文档文件似乎有很多我正在寻找的关键字,但它似乎都需要构建到一个可执行文件中。此外,程序混淆的主要目的与我的目的相反,我的目的是创建一个任何人都可以使用的公共API.dll。模糊处理过程会将它从.NET程序集转换为本机程序集,从而限制了它的可用性。没问题,看起来@Krtek能够为您指明正确的方向:我认为这是一件常见的事情。我不知道我会求助于第三方工具或奇怪的技术。谢谢你的回答。对于你在问题中的评论,我没有权利对你的回答发表评论,我相信你不能,你必须使用ILMerge或Assembly.Resolve。或者你可以只使用你的应用程序/库分发,但是你需要分发多个文件。奇怪的是,每个人对setup.exe的记忆都在快速衰退。我认为这是一件常见的事情。我不知道我会求助于第三方工具或奇怪的技术。谢谢你的回答。对于你在问题中的评论,我没有权利对你的回答发表评论,我相信你不能,你必须使用ILMerge或Assembly.Resolve。或者你可以只使用你的应用程序/库来分发,但是你需要分发多个文件。奇怪的是,每个人对setup.exe的记忆都在快速衰退。