2

私はc++/ cliインターフェイスDLLを呼び出すC#フォームを持っています。これは、win32ネイティブc++dllを呼び出します。もともとこれはVS2010で書かれていて、機能していました-System::Stringをstd::stringにマーシャリングし、ネイティブdllに渡して、値を計算することができました。次に、C#およびc ++ / cliプロジェクトをVS2012に変換して、インテリセンスを有効にしました。これには、VS2010で4.0.NETフレームワークを再度有効にするためのサービスパックのインストールが必要でした。2010年にWin32dll、VS2012でC#アプリとc ++ / cli dllを再構築しましたが、dllの呼び出しでエラーが発生します。

デバッグアサーションに失敗しました!

プログラム:...ファイル:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c行:1424

式:_pFirstBlock == pHead

public ref class ManagedWrapper
{
    CSampleWin32Library* m_pUnmanagedWrapper;


public:
    ManagedWrapper() {m_pUnmanagedWrapper = new CSampleWin32Library();}
    ~ManagedWrapper() {delete m_pUnmanagedWrapper;}

    //Test call to prove integration
    void Test(int x, System::String^ testString) {
        //marshaling example: http://msdn.microsoft.com/en-us/library/bb384865.aspx         
        std::string tmpStdString = marshal_as<std::string>(testString);
        m_pGambitUnmanagedWrapper->Test(x, tmpStdString); //ERROR OCCURS HERE
    };      
};

うまくいけば、これは失われた設定、またはVS2012で必要になった設定と同じくらい簡単です。私の知る限り、それ以外のコードは変更しませんでした。

4

1 に答える 1

1

このエラーの主な原因は、ヒープ A で malloc したメモリ ブロックがヒープ B で解放されることです。

Windows Via C/C++ --Part IV Dynamic-Link Librariesを参照してください。

アプリケーションは、実行中に CRT を呼び出します。

CRT を呼び出す方法は 2 つあります。DLL C/C++ ランタイム ライブラリにリンクするか、静的 C/C++ ランタイム ライブラリにリンクし、さまざまなバージョンの CRT を使用します。

それらはすべて異なるメモリ管理を使用します。

したがって、メモリと DLL にリンクされたコードを解放するときは注意が必要です。

于 2013-08-28T01:48:56.777 に答える