4

アンマネージ C++ ライブラリ (C# で使用する) 用の非常に単純なラッパーを作成しました。Wrapper には、1 つのアンマネージ クラスと 1 つのマネージ クラスがあります。マネージド クラスには、アンマネージド クラスのプライベート メンバーがあり、そのように使用します。

私は非常に簡単なセットアップを行いました - すべてが機能しているかどうかを確認するために、1 つの関数のみのラッパーを作成しました。しかし、ラッパーのインスタンスを作成するとすぐに、アプリケーションは「LoaderLock が検出されました」という例外を受け取り、次のメッセージが表示されます。

DLL 'c:\path\CPPWrapper.dll' は、OS ローダー ロック内でマネージ実行を試みています。DllMain またはイメージ初期化関数内でマネージ コードを実行しようとしないでください。実行すると、アプリケーションがハングする可能性があります。

「LoaderLock」例外の中断をオフにすると、「FileLoadException was unhandled」が表示されます。

Could not load file or assembly 'CPPWrapper.dll' or one of its dependencies. Exception from HRESULT: 0xE0434352

私が何を間違っているのか、どうすればこの問題を解決できますか?

CPPWrapper.h

// CPPWrapper.h

#pragma once

#include "Native.h"

using namespace System;

namespace CPPWrapper {

    public ref class Class1
    {
        public:

        Class1() : mnt(new Native)
        {

        }

        ~Class1(void)
        {
            // call the finalize method
            this->!Class1();
        }

        // Finalize (for garbage collection)
        !Class1(void)
        {
            // Remove unmanaged class
            delete mnt;
            mnt = NULL;
        }

        void Napravi()
        {
            mnt->CreatePK();
        }

    private:
        Native *mnt;
    };

}
4

2 に答える 2

3

これを修正する正しい方法は 、「LoaderLock」例外のブレークをオフにしないで追加すること#pragma unmanagedであることがわかりました。dllmain.c

詳細については、混合アセンブリの初期化を参照し、DllMain セクションまで下にスクロールしてください。基本的に何が起こっているかというと、プロジェクトは DllMain 関数をマネージ (MSIL) としてコンパイルしていますが、アンマネージ コードでしか実行されません。これにより#pragma unmanaged、関数がアンマネージ関数として強制的にコンパイルされます。

だから私dllmain.cは今です:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

#pragma unmanaged
BOOL APIENTRY DllMain( HMODULE hModule,
                   DWORD  ul_reason_for_call,
                   LPVOID lpReserved
                 )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
于 2012-09-26T15:59:14.807 に答える