如何避免与本机NuGet包重复的DLL冲突?

时间:2013-08-14 02:35:01

标签: c++ visual-studio visual-c++ nuget

我们正在VS2012中构建一个Windows应用商店应用,它依赖于C#(主UI)项目,几个C ++项目(用于支持代码)和一个外部专有库。外部库作为DLL +头文件提供给我们,我们已使用NuGet将其放入原生AutoPackage包中。

三个C ++项目调用外部库。我可以为三个项目中的每个项目安装外部库包(来自GUI或命令行),并且可以编译和构建整个解决方案,而不会受到Visual Studio的投诉。但是,如果我退出Visual Studio然后重新打开解决方案,或者如果我尝试卸载并重新加载包括包的项目,Visual Studio将拒绝加载导入NuGet包的两个项目。它说:

foo.vcxproj : error  : The item "..\..\..\..\abc\packages\Bar.WinRT.redist.1.2.3.4\build\native\bin\Win32\bar.dll" already exists under the filter "".

其中Bar.WinRT.redist.1.2.3.4是包含bar.dll的外部库包,而foo是试图包含该包的项目。 (为简单起见,编辑了文件名,以及项目隐私。)

我可以让任何一个影响项目再次加载的唯一方法是从Bar.WinRT.redist手动删除foo.vcxproj的导入并重新加载项目。重新加载项目后,我可以从包管理器命令行或Manage NuGet Packages对话框重新安装Bar.WinRT.redist

AutoPackage分别自动从头文件和dll构建“Bar.WinRT”和“Bar.WinRT.redist”。只有用于构建最终.exe的项目需要“redist”包,但它会被自动拉入,因为AutoPackage使非redist包(包含头文件)依赖于redist包。

包含外部程序包的最佳方法是什么,仍然可以正确加载项目(并且只有一个DLL的副本在.exe的构建输出中结束)?

1 个答案:

答案 0 :(得分:0)

问题的根本原因似乎是无法加载的项目在其项目文件中具有AppContainerApplication属性设置,并且没有WindowsAppContainer属性设置。

我通过手动编辑项目XML文件删除了AppContainerSetting属性。然后我

  1. 在常规属性页面上启用Windows Store App Support
  2. 在“C / C ++所有选项”页面上将Consume Windows Runtime Extension选项设置为Yes (/ZW),然后
  3. 同时在C / C ++所有选项页面上将Enable Minimal Rebuild设置为No (/Gm-)
  4. 目前尚不清楚在添加NuGet包之前项目是如何加载的,但更新设置似乎已经解决了这个问题。