如何避免与本机NuGet包发生重复DLL冲突

How do I avoid duplicate DLL conflicts with native NuGet packages?

本文关键字:DLL 冲突 包发生 NuGet 何避免 本机      更新时间:2023-10-16

我们正在VS2012中构建一个Windows应用商店应用程序,该应用程序依赖于一个C#(主UI)项目、几个C++项目(用于支持代码)和一个外部专有库。外部库以DLL+头文件的形式提供给我们,我们已使用AutoPackage将其放入本机NuGet包中。

其中三个C++项目调用外部库。我可以为这三个项目中的每一个安装外部库包(从GUI或命令行),并且可以编译和构建整个解决方案,而不会受到Visual Studio的任何抱怨。但是,如果我退出Visual Studio,然后重新打开解决方案,或者如果我尝试卸载并重新加载包括包在内的项目,Visual Studio将拒绝加载导入NuGet包的两个项目。上面写着:

foo.vcxproj : error  : The item "........abcpackagesBar.WinRT.redist.1.2.3.4buildnativebinWin32bar.dll" already exists under the filter "".

其中,Bar.WinRT.redist.1.2.3.4是包含bar.dll的外部库包,foo是试图包含该包的项目。(为了简化和项目隐私,对文件名进行了编辑。)

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

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

什么是包含外部包并仍然正确加载项目的最佳方式(并在使用.exe的构建输出中恰好有一个DLL副本)?

问题的根本原因似乎是未能加载的项目的项目文件中有AppContainerApplication属性设置,而没有WindowsAppContainer属性设置。

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

  1. 启用"常规属性"页面上的CCD_ 7
  2. 在"C/C++所有选项"页面上将Consume Windows Runtime Extension选项设置为Yes (/ZW),然后
  3. 同样在"C/C++所有选项"页面上将Enable Minimal Rebuild设置为No (/Gm-)

目前尚不清楚在添加NuGet包之前该项目是如何加载的,但更新设置似乎已经解决了这个问题。