21

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

为此,我需要在我的 EXE 的输出文件夹中拥有所有引用的 DLL 及其整个依赖关系树。例如,我可以通过在属性窗口中将依赖项标记为“复制本地”来做到这一点,但这仅适用于 EXE 项目的直接引用,因此还远远不够。另一种方法是制作一个设置项目,但我的客户和我也想避免这种情况(在最终版本中,我将使用 ClickOnce)。当然,我总是可以完全手动完成,手动收集所有 DLL,但那是一场噩梦。

是否有一些工具、msbuild 技巧、命令行选项、强制 Visual Studio 在构建期间收集我的 EXE 的整个依赖关系树并将它们复制到输出文件夹的任何技巧?这样我就可以将所有内容压缩在一起并发送给我的客户。

4

3 回答 3

1

我实际上选择了一个有点“中间”的解决方案,方法如下。

  1. 我创建了一个“虚拟”设置项目,只关心添加项目输出(主要输出、本地化资源、内容等),而不关心任何设置。这是一个 2 分钟的任务。
  2. 我构建了安装项目,并将 MSI 文件作为输出。
  3. 我已将 MSI 文件的内容提取到特定文件夹,例如名为“MyAppPortable”的文件夹。我在这里找到了解决方案。命令行命令是

    msiexec /a "absolute_path_to_my_MSI_output" /qb TARGETDIR="absolute_path_to_my_desired_output_folder"

  4. 我得到了完整的应用程序及其所有已解决的依赖项(后期绑定依赖项除外,但我通过将它们添加为我的项目的引用来手动处理它们)。我可以压缩整个文件夹,将其放在另一台计算机上,瞧,一切正常。

于 2013-07-05T09:52:12.317 回答
1

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

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

在 VS 2012 中,右键单击项目 => 属性 => 选择构建(左窗格) => 设置输出路径:

VS 2012 中的输出路径

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

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

更新:

使用上述工具不会产生后期绑定(在运行时)的程序集引用,对于这种情况,您可以使用:Fusion(程序集绑定日志查看器)

于 2013-07-05T00:14:39.560 回答
0

从这个问题中查看 Fody/Costura 的建议: Embedding DLLs in a compiled executable

这很棒!我只是出于类似的需求尝试了它,在不到几分钟的时间里,我就有了一个完全可移植的(.Net 框架除外)exe,我可以轻松地将它提供给同事。

于 2014-12-12T02:05:00.460 回答