2011-09-27 27 views
2

问题如何复制visual studio setup项目的“检测到的依赖项”功能?

是否有一个罐头的解决方案,将检测(递归)给定的Visual Studio项目文件的所有依赖?这基本上是Visual Studio安装项目的“检测到的依赖项”功能所做的 - 但我需要通过编程访问依赖项列表(理想情况下来自MSBuild)。

背景(如果你想了解实际问题,我试图解决阅读)

我工作的自动化构建的WinForms应用程序利用第三方UI库。为了成功构建应用程序,必须在构建/开发机器上(通过供应商的安装程序)“安装”库(这会将程序集放入GAC并安装许可组件)。供应商的dll必须通过我们的项目文件中的GAC来引用。不幸的是,没有办法避免这种“安装”要求(我喜欢使用从我的源代码管理系统获取的本地引用,就像我几乎所有其他的第三方引用一样,但是这在这是不可能的案件)。

我们利用“插件”架构,因此将可执行项目不直接引用这些组件 - 它们都间接地通过“插件”项目(后者又由可执行项目中引用)引用。因此,在“插件”项目中将GAC引用设置为“copy local = true”仅将供应商dll复制到插件项目的输出目录;它们不会递归复制到可执行项目的输出目录。因此,没有安装这些供应商dll的计算机上,可执行项目的输出目录的xcopy部署不起作用,因为它们不在输出目录中。

我们目前使用MSI部署(通过Visual Studio安装工程),并想切换到Xcopy部署。供应商的DLL目前正在被打包到我们的msi中,因为依赖关系是由安装项目的“检测到的依赖关系”功能内发生的任何魔术“检测”的。使我的xcopy部署工作的解决方案是只需要可执行项目直接引用被其引用的插件使用的供应商dll,并将“copy local”设置为true。为了确保所有需要的供应商DLL已经以这种方式被引用,我想生成可执行项目的“检测到的依赖关系”的名单,声称所有这些依赖存在于可执行项目的输出目录,并构建失败如果他们不全都在场的话。

我可以通过分析的csproj文件,编译所有的“参考”条目列表并递归地跟踪项目引用这样做我自己。不过,我希望在某处有罐头功能,特别是考虑到“检测到的依赖关系”足够聪明,可以过滤出框架dll,但包含我的GAC引用的供应商dll。

谢谢!

回答

0

大多数情况下,您可以使用Reflection来解决这个问题 - 您的插件及其主机很可能具有通用接口合同。您的代码在构建完成后会扫描所有程序集以使用一组已知的接口协定,并通过IDE扩展自动化向安装程序项目添加/更新这些接口协定。编写一个手动刷新的插件可能是一种选择,编写和注册MSBuild任务是更好的选择。

我知道这是不是一个“罐头的解决方案”,但工作应该小于一个KLOC所需要的量。

+0

对不起 - 我可能还不够清楚。我不想自动创建我的安装程序项目。我正在寻找ELIMINATE我的安装程序项目,并转向基于xcopy的部署。但是,很难确保GAC引用的程序集最终会被复制到我的应用程序的输出目录中。这就是我想解决的问题(找出需要复制到我的输出中的组件)。 –

+0

现在我明白了(我希望)。只需将这些DLL复制到解决方案中的文件夹(添加解决方案项目文件夹),将其检入并使用_content_部署将它们添加为_links_到主项目。这也适用于非托管DLL。 – aquaherd

相关问题