我的.NET/C#项目需要使用一些VC++的DLL,其中一个是C++/CLI DLL,我用它作为.NET项目的公共接口。其他的DLL是用原生C++编写的。我没有访问这些VC++ DLL的源代码,只能使用它们。
我创建了一个.NET测试项目并引用了C++/CLI DLL。编译器很开心,没有问题。只有一个问题:当我启动.NET程序的EXE文件时,由于缺少VC++核心DLLs,我会收到关于C++ DLLs的错误信息。sxstrace显示如下(已经缩短):
INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
INFO: Reference: Microsoft.VC80.OpenMP,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195"
...
ERROR: Cannot resolve reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195".
我不是傻瓜,已经尝试了多种方法。我已经阅读了很多关于WinSxS的东西,以便更深入地了解发生了什么事情。 现在我到了一个奇怪的地方。我想要执行程序的系统中安装了当前版本为8.0.50727.762(SP1)的VC++ Redistributable软件包。我知道winsxs中有一个用于Microsoft.VC80.CRT的策略文件,将该程序集的所有版本都重定向到当前版本8.0.50727.762(这是此问题的解决方案)。 但正如上面的错误所述,这个策略文件似乎没有起作用或没有被考虑。系统只是想找到程序集的8.0.50727.6195版本。
那么这就是第一个问题:问题在哪里?解决了这个问题后,我可以解决最初的问题......