Winforms 如何复制visual studio安装项目的“检测到的依赖项”功能?

Winforms 如何复制visual studio安装项目的“检测到的依赖项”功能?,winforms,visual-studio,deployment,msbuild,build,Winforms,Visual Studio,Deployment,Msbuild,Build,问题: 是否有一个固定的解决方案可以递归地检测给定VisualStudio项目文件的所有依赖项?这基本上就是VisualStudio安装项目的检测依赖项功能所做的,但是我需要从MSBuild对依赖项列表进行编程访问 如果你想知道我试图解决的实际问题,请阅读背景资料 我正在为利用第三方UI库的WinForms应用程序进行自动构建。为了成功构建应用程序,必须通过供应商的安装程序在build/dev计算机上安装这些库。这会将程序集放入GAC并安装许可组件。供应商的DLL必须通过GAC在我们的项目文件中

问题:

是否有一个固定的解决方案可以递归地检测给定VisualStudio项目文件的所有依赖项?这基本上就是VisualStudio安装项目的检测依赖项功能所做的,但是我需要从MSBuild对依赖项列表进行编程访问

如果你想知道我试图解决的实际问题,请阅读背景资料

我正在为利用第三方UI库的WinForms应用程序进行自动构建。为了成功构建应用程序,必须通过供应商的安装程序在build/dev计算机上安装这些库。这会将程序集放入GAC并安装许可组件。供应商的DLL必须通过GAC在我们的项目文件中引用。不幸的是,没有办法避免这种安装要求,我希望使用从我的源代码管理系统获取的本地引用,就像我处理几乎所有其他第三方引用一样,但在这种情况下这是不可能的

我们使用插件体系结构,因此可执行项目不直接引用这些组件中的任何一个-它们都是通过插件项目间接引用的,插件项目反过来又被可执行项目引用。因此,在插件项目中将GAC引用设置为copy local=true只会将供应商DLL复制到插件项目的输出目录中;它们不会递归地复制到可执行项目的输出目录。因此,在没有安装这些供应商DLL的机器上,可执行项目输出目录的xcopy部署无法工作,因为它们不在输出目录中

我们目前通过VisualStudio安装项目使用msi部署,并希望切换到xcopy部署。供应商DLL目前正在打包到我们的msi中,因为依赖关系是由安装项目检测到的依赖关系功能中发生的任何魔法检测到的。我让xcopy部署工作的解决方案是只要求可执行项目直接引用其引用插件使用的供应商DLL,并将copy local设置为true。为了确保以这种方式引用了所有必需的供应商DLL,我想生成一个检测到的可执行项目依赖项列表,断言所有这些依赖项都存在于可执行项目的输出目录中,如果它们不都存在,则生成失败

我可以通过分析csproj文件、编译所有引用条目的列表以及递归地跟踪项目引用来实现这一点。然而,我希望在某个地方有可以做到这一点的固定功能——特别是考虑到检测到的依赖关系足够聪明,可以过滤掉框架DLL,但包括我的GAC引用的供应商DLL


谢谢

您最有可能通过反射来解决这个问题-您的插件和它们的主机很可能有一个共同的接口契约。代码将在生成所有程序集后扫描它们是否使用了一组已知的接口约定,并通过IDE可扩展性自动化将它们添加/更新到安装程序项目中。编写手动刷新的插件可能是一种选择,编写并注册MSBuild任务是更好的选择


我知道这不是一个“固定的解决方案”,但所需的工作量应该少于1 KLOC。

最有可能的是,您可以通过反射来解决这个问题-您的插件和它们的主机很可能有一个共同的接口契约。代码将在生成所有程序集后扫描它们是否使用了一组已知的接口约定,并通过IDE可扩展性自动化将它们添加/更新到安装程序项目中。编写手动刷新的插件可能是一种选择,编写并注册MSBuild任务是更好的选择


我知道这不是一个“罐装解决方案”,但所需的工作量应该少于1千磅。

对不起,我可能不够清楚。我不希望自动创建我的安装程序项目。我希望取消我的安装程序项目,转而使用基于xcopy的部署。但是,很难确保GAC引用的程序集最终被复制到我的应用程序的输出目录中。这就是我试图解决的问题,找出我需要复制到输出中的程序集。现在我希望我能得到它。只需将这些DLL复制到解决方案中的文件夹添加解决方案项文件夹,签入它们,并使用content deployment将它们作为指向主项目的链接添加。这也适用于非托管DLL。对不起,我可能不够清楚。我不希望自动创建我的安装程序项目。我希望取消我的安装程序项目,转而使用基于xcopy的部署。但是,很难确保GAC引用的程序集最终以co结尾
被剪切到我的应用程序的输出目录中。这就是我试图解决的问题,找出我需要复制到输出中的程序集。现在我希望我能得到它。只需将这些DLL复制到解决方案中的文件夹添加解决方案项文件夹,签入它们,并使用content deployment将它们作为指向主项目的链接添加。这也适用于非托管DLL。