1

在此先感谢... 问题: 当用 C++/CLI 编写的 Wrapper(链接到 v110,在 VS2012 中开发)尝试使用本机 DLL(链接 v100,在 VS2010 中开发)时,有人可以帮我理解是否存在任何不兼容问题)?

目标: 我正在开发一个 .net 4.0 应用程序。我使用 VS2012 作为我的开发环境。此应用程序必须使用一些遗留的 C++ Native DLL。为此,我正在编写 Wrapper 项目。

问题: 在我的包装器中,我将 std::vector 对象引用作为空容器传递,以由我的本机 DLL 的 API 填充。这个API返回第一个元素非常好,但第二个元素向前,都是悬空指针??请帮我理解出了什么问题??

替代解决方案: 当我在 Wrapper 中更改项目设置以链接 v100 工具集时,一切正常。

问题:

  1. 在我的场景中,v110 和 v100 是否相互不兼容?
  2. 还有其他可用的解决方案吗?
4

1 回答 1

1

您正在使用两种不同的std::vector<> 实现。一个来自 v100 C++ 库,另一个来自 v110 库。C++11 语言修订版允许的大幅改进确保它们一样。您的包装器在尝试访问导出的对象时只会读取垃圾和/或在写入时随机损坏它。CRT 也发生了显着变化,v110 使用不同的堆,所以简单的事情,比如在一个模块中分配一个对象并在另一个模块中销毁它也无法正常工作。

跨模块边界导出 C++ 类对象是一项危险的冒险,没有什么能像 .NET 这样的 VM 提供的执行保证。确保所有模块都是由完全相同的编译器使用完全相同的设置构建的,并且 CRT 的共享副本是硬性要求。

于 2013-11-12T16:09:36.407 回答