C# 如何使VisualStudio在生成期间解析并包含项目的所有依赖项?

C# 如何使VisualStudio在生成期间解析并包含项目的所有依赖项?,c#,visual-studio-2010,msbuild,C#,Visual Studio 2010,Msbuild,我目前在VS2010下有一个大型解决方案,有很多项目和依赖项。其中一些是安装到GAC的,一些只是从“lib”文件夹中包含的。我需要构建我的一个项目(特别是WinForms应用程序),以便能够在任何非开发计算机上运行,而无需任何安装过程(当然,除了.NET运行时),就像便携式应用程序一样 要使其工作,我需要将所有引用的DLL及其整个依赖关系树放在我的EXE的输出文件夹中。例如,我可以在properties窗口中将依赖项标记为“Copy local”,但这只适用于EXE项目的直接引用,所以这远远不够

我目前在VS2010下有一个大型解决方案,有很多项目和依赖项。其中一些是安装到GAC的,一些只是从“lib”文件夹中包含的。我需要构建我的一个项目(特别是WinForms应用程序),以便能够在任何非开发计算机上运行,而无需任何安装过程(当然,除了.NET运行时),就像便携式应用程序一样

要使其工作,我需要将所有引用的DLL及其整个依赖关系树放在我的EXE的输出文件夹中。例如,我可以在properties窗口中将依赖项标记为“Copy local”,但这只适用于EXE项目的直接引用,所以这远远不够。另一种方法是创建一个安装项目,但我和我的客户都希望避免这种情况(在最终版本中,我将使用ClickOnce)。当然,我总是可以纯手工操作,手动收集所有DLL,但那真是一场噩梦


是否有某种工具、msbuild技巧、命令行选项或其他黑客手段,迫使Visual Studio在生成过程中收集我的EXE的整个依赖关系树,并将它们复制到输出文件夹?这样我就可以将所有内容压缩在一起并发送给我的客户端。

基本上,使用Visual Studio,您可以将所有解决方案的项目设置为构建到同一输出文件夹中,并将此文件夹用作Windows窗体应用程序文件夹(应用程序EXE将驻留在其中)

通过这样做,您将协调应用程序所依赖的所有可能的程序集引用

在VS 2012中,右键单击项目=>Properties=>Select Build(左窗格)=>设置输出路径:

我会选择一个解决方案级文件夹作为输出路径

如果禁止在您的工作场所执行此类修改,那么我建议您使用类似以下的依赖性分析工具来查询和收集应用程序所依赖并在运行时需要的适当程序集:

更新:


使用上述工具不会产生延迟绑定(在运行时)的程序集引用,对于这种情况,您可以使用:

我实际上选择了一种“中间”解决方案,如下所示

  • 我创建了一个“虚拟”安装项目,不关心任何设置,只关心添加项目输出(主要输出、本地化资源、内容等)。这样做需要两分钟的时间
  • 我构建了安装项目,并将MSI文件作为输出
  • 我已经将MSI文件的内容提取到一个特定的文件夹中,例如称为“MyAppPortable”。我找到了解决办法。命令行命令是

    msiexec/a“绝对路径到我的MSI输出”/qb TARGETDIR=“绝对路径到我的所需输出文件夹”

  • 我得到了完整的应用程序及其所有已解析的依赖项(除了后期绑定的依赖项,但我通过将它们作为项目的引用来手动处理它们)。我可以把整个文件夹压缩,放到另一台电脑上,瞧,一切都很好


  • 查看此问题中的Fody/Costura建议:


    太棒了!我只是出于类似的需要尝试了一下,不到几分钟,我就有了一个完全可移植的(除了.Net framework)exe,可以很容易地提供给同事。

    谢谢你,但正如你所写,我不可能做这样的全局更改。而且这听起来也不是一个好的做法。我将检查您建议的工具,但会等待一段时间,以获得或找到更简单的方法。@ZoltaánTamási无论您要做什么,都要考虑到您的应用程序可能用于程序集解析-使用我提到的工具无法解决这一问题。请参阅我的更新以了解后期绑定。有趣。。通过从MSI软件包中提取文件,您可以检索应用程序的整个依赖关系树?是的,因为安装项目包含完整安装程序的所有文件(DLL、资源、PDB、您添加到安装项目中的所有内容)。我只是从MSI中“黑客”出了安装文件,就像正常的安装过程将它们放在program files文件夹中一样。你不能创建一个新文件夹并将所有必需的依赖项文件复制到其中吗?MSI是如何帮助你的?它的附加值是什么?它为你做了什么吗?现在还不清楚使用MSI的真正好处是什么-这听起来就像一个很长的复制操作。问题是找到所有需要的文件。安装(或更一般地说,部署)项目可以递归地将所有依赖项DLL、资源、内容文件收集在一起,无论它们是否位于GAC、“lib”文件夹、任何已安装的第三方库或任何引用的项目中。所有这些东西都打包到MSI文件中。手动收集所有这些(即部署应用程序)是一场噩梦(我尝试过),并在很多方面导致错误(缺少DLL、缺少内容文件或资源、版本、平台不匹配等)。不输出.msi,可以将安装项目配置为输出松散的文件,从而节省提取工作。