如何避免与本机NuGet包发生重复DLL冲突
How do I avoid duplicate DLL conflicts with native NuGet packages?
我们正在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属性。然后我
- 启用"常规属性"页面上的CCD_ 7
- 在"C/C++所有选项"页面上将
Consume Windows Runtime Extension
选项设置为Yes (/ZW)
,然后 - 同样在"C/C++所有选项"页面上将
Enable Minimal Rebuild
设置为No (/Gm-)
目前尚不清楚在添加NuGet包之前该项目是如何加载的,但更新设置似乎已经解决了这个问题。
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 从Delphi调用C++DLL时发生访问冲突
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 如果使用低于 VS2015 的 vc++ 编译器版本编译,则 DLL 中的访问冲突
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- C++ python 中的函数来自使用 ctypes 的.dll - 找不到函数和访问冲突
- 使用参数的 C# 委托回调会导致从 DLL 调用时C++访问冲突
- 实验室中0x6BE20E11 (ucrtbased.dll) 的未处理异常.exe: 0xC0000005:访问冲突读取
- 将静态库转换为 DLL 会导致在 main 之前出现访问冲突
- 在 "<name>.exe" 中0x00007FFF168E1657 (vcruntime140d.dll) 引发异常:0xC0000005:访问冲突写入位置0x0000000000000
- 从C#返回调用C++dll函数的值时发生访问冲突
- OpenGL:glDrawArrays()引发异常(nvoglv32.dll)读取位置0x00000000时发生访问冲突
- C# 到非托管 C++ DLL 访问冲突/"frame not in module"
- QtGui4.lib(QtGui4.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- 使用boost::signals2并卸载DLL时发生访问冲突
- 跨dll的c++类冲突
- VkLayer_param_checker.dll访问冲突
- 注入DLL的函数中出现访问冲突异常(5)
- 如何避免与本机NuGet包发生重复DLL冲突