我遇到了几个VC ++ DLL的问题,我应该将其包含在我的.NET / C#项目中。一个VC ++ DLL是一个C ++ / CLI DLL,我将其用作.NET项目的公共接口。其他DLL是用本机C ++编写的。我无法访问VC ++ DLL的源代码,我只需要使用它们。
我做了一个.NET测试项目并引用了C ++ / CLI DLL。没问题,编译器很幸运,很棒。只有一个问题:当我启动.NET程序的EXE时,由于缺少VC ++核心DLL,我得到有关C ++ DLL的错误。 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(这是http://blogs.msdn.com/b/nikolad/archive/2007/03/29/a-solution-to-two-references-to-different-versions-of-crt-mfc-atl-in-one-application-manifest-file.aspx处问题的解决方案)。 但正如上面的错误所说,此策略文件似乎不起作用或不予考虑。系统只是想找到8.0.50727.6195版本的程序集。
现在这是第一个问题:这里的问题是什么?在弄清楚这个之后,我可以解决最初的问题......
答案 0 :(得分:9)
好的,现在它有效 - 谢谢你的帮助。
我想出了两个必须解决的问题:
1)我不得不安装“Microsoft Visual C ++ 2005 Service Pack 1 Redistributable Package MFC安全更新”,它部署了VC ++程序集的8.0.50727.6195版本。这个更新很难在Microsoft服务器上找到,所以这里是链接:http://www.microsoft.com/download/en/details.aspx?id=26347 通常你只能找到8.0.50727.762版本(“Visual C ++ 2005 Service Pack 1 Redistributable Package”),它已经过时了。由于C ++ DLL是针对6195编译的,所以安装更新解决了第一个问题。
2)虽然C ++ / CLI DLL是在发布模式下编译的,但下面的本机C ++ DLL已在调试模式下提供。现在Microsoft许可协议禁止部署VC ++调试DLL,VC ++ Redist包不包含VC ++调试DLL。 http://msdn.microsoft.com/en-us/library/aa985618.aspx说:
应用程序的调试版本不可再发行,并且各种Visual C ++动态链接库(DLL)的调试版本都不可再发行。
解决方案:本机C ++ DLL的开发人员给了我发布版本,一切正常......