3

マネージC++に移行しようとしているいくつかのCOMインターフェイスを実装するC++dllがあります。/ clrコンパイラフラグを設定し、ランタイムライブラリプロパティを/MTから/MDに変更して、これら2つのフラグ間の競合を回避しましたが、変更したのはそれだけです。ビルドプロセス中にdllを登録しようとすると、次のエラーが発生します。

R6033-ネイティブコードの初期化中にこのアセンブリのMSILコードを使用しようとしましたこれは、アプリケーションにバグがあることを示しています。これは、ネイティブコンストラクターまたはDllMainからMSILコンパイル済み(/ clr)関数を呼び出した結果である可能性があります。

ローダーロックについて読んだのですが、理解できません。マネージコードに呼び出しを1つも追加していません。DllMainプロシージャの全体は次のとおりです。

[編集-以下のコメントごとに、cppファイルの先頭に管理されていない#pragmaを追加しましたが、改善はありません。Module initは、私が知る限り、ATLライブラリに含まれているすべてのコードです。]

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    lpReserved;
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        _Module.Init(ObjectMap, hInstance, &MYGUID);
        DisableThreadLibraryCalls(hInstance);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
        _Module.Term();
    return TRUE;    // ok
}
4

2 に答える 2

4

/clr コンパイラ フラグは、プロジェクト全体ではなく、マネージ コードを使用するファイルにのみ追加する必要があります。

これがVisual Studioの「ウィザード」の機能です。テストした方法は次のとおりです。

  • Visual C++ ATL プロジェクトを作成する
  • COM インターフェイス ([プロジェクト] -> [クラスの追加]) を持つために、ATL シンプル オブジェクトを追加しました。
  • CLR コンポーネント クラスを追加しました。ウィザードで、「ネイティブ プロジェクトに CLR コンポーネントを追加しようとしています。プロジェクトは、共通言語ランタイムをサポートするように変換されます。」というメッセージが表示されました。
  • プロジェクトをコンパイルし、正常にコンパイルして正常に登録します。
  • プロジェクト設定を確認->「共通言語ランタイムサポートなし」
  • clrcomponennt.cpp の設定を確認 -> 「共通言語ランタイム サポート (/clr)」
  • OleView で dll を開きました -> COM インターフェイスが存在しました
  • Red Gate の .NET Reflector で dll を開きました -> clrcomponent が存在していました
于 2009-08-28T22:54:52.893 に答える
0

/ clrフラグを使用すると、メソッドが管理されます(つまり、MSILにコンパイルされます)が、管理されていないDllMainに対してメソッドを呼び出しています。残念ながら、それは私の限られた知識がそれを受け入れることができる限りです。

于 2009-08-28T21:44:39.323 に答える