1

事前に感謝します... 問題: C++/CLI で記述された Wrapper (VS2012 で開発された v110 にリンク) がネイティブ DLL (VS2010 で開発された v100 にリンク) を使用しようとしているときに非互換性の問題があるかどうかを誰かが理解するのを手伝ってくれますか? )?

目的: .net 4.0 アプリケーションに取り組んでいます。VS2012 を開発環境として使用しています。このアプリケーションは、従来の C++ ネイティブ DLL の一部を使用する必要があります。そのために、Wrapper プロジェクトを作成しています。

問題: ラッパーで、ネイティブ DLL の API によって満たされる空のコンテナーとして std::vector オブジェクト参照を渡しています。この API は最初の要素を完全に正常に返しますが、2 番目の要素以降はすべてダングリング ポインターですか?? 何が悪かったのか理解するのを手伝ってください??

別の解決策: プロジェクト設定を変更して、Wrapper で v100 ツールセットをリンクすると、すべて正常に動作します。

質問:

  1. 私のシナリオでは、v110 と v100 は互いに互換性がありませんか?
  2. 利用可能な他の解決策はありますか?
4

1 に答える 1

1

You are using two different std::vector<> implementations. One from the v100 C++ library, another from the v110 library. The drastic improvements permitted by the C++11 language revision ensure that they are not the same. Your wrapper will just read garbage when it tries to the access the exported object and/or randomly corrupt it when it writes it. The CRT has been significantly changed as well, v110 uses a different heap so simple things like allocating an object in one module and destroying it another cannot work either.

Exporting C++ class objects across module boundaries is a perilous adventure, nothing like the execution guarantees you get from a VM like .NET. Ensuring that all modules are built by the exact same compiler using the exact same settings and a shared copy of the CRT is a hard requirement.

于 2013-11-12T16:09:36.407 に答える