【问题标题】:How do I avoid duplicate DLL conflicts with native NuGet packages?如何避免与本机 NuGet 包重复的 DLL 冲突?
【发布时间】:2013-08-15 00:02:10
【问题描述】:

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

三个 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 是试图包含该包的项目。 (为简单起见和项目隐私,对文件名进行了编辑。)

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

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

包含外部包并仍然正确加载项目的最佳方法是什么(并且在生成输出中精确地使用 .exe 结束 DLL 的一个副本)?

【问题讨论】:

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


    【解决方案1】:

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

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

    1. 在常规属性页面上启用了Windows Store App Support
    2. 在 C/C++ 所有选项页面上将 Consume Windows Runtime Extension 选项设置为 Yes (/ZW),然后
    3. Enable Minimal Rebuild 设置为 No (/Gm-),也在 C/C++ 所有选项页面上。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多