10

我遇到了几个 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 包。我知道 winxs 中有一个 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 版本的程序集。

现在这是第一个问题:这里有什么问题?在我弄清楚这一点之后,我可以解决最初的问题......

4

1 回答 1

9

好的,现在它可以工作了 - 感谢您的帮助。

我想出了两个必须解决的问题:

1) 我必须安装“Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC 安全更新”,它部署了版本 8.0.50727.6195 的 VC++ 程序集。此更新在 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 是在 Release 模式下编译的,但下面的原生 C++ DLL 是在 Debug 模式下交付的。现在,Microsoft 许可协议禁止部署 VC++ 调试 DLL,并且 VC++ Redist 包不包含 VC++ 调试 DLL。 http://msdn.microsoft.com/en-us/library/aa985618.aspx说:

应用程序的调试版本不可再分发,并且各种 Visual C++ 动态链接库 (DLL) 的调试版本均不可再分发。

解决方案:本机 C++ DLL 的开发人员给了我一个发布版本,一切正常...

于 2012-02-06T08:59:13.740 回答