none
混在モード DLL の実装法について RRS feed

  • 質問

  • 混在モード DLL の実装法についてよく分からないことがあります。
    ご存じの方がいましたらご教授下さい。よろしくお願いします。
    環境:WinXP、VS2003


    MFC と静的にリンクする標準 DLL (sample.dll) とそのインポートライブラリ (sample.lib) が第三者から提供されており、これを C# から利用するために C++ で sample.lib をインポートし、マネージラッパー DLL (sampleWrapper.dll) を作成しようとしています。
    sampleWrapper.dll は MFC と CLR を利用する混在モード DLL になるので、
    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vcmex/html/vcconConvertingManagedExtensionsForCProjectsFromPureIntermediateLanguageToMixedMode.asp
    で説明されている手順のうち、まずは「マネージ DLL を混合モードに変換するには」を行い、ビルド警告 LNK4243 は解消ました。
    この時点でもビルドは成功し、sampleWrapper.dll を利用する C# アプリケーションも正しく動作しているように見えます。

    上記 URL によれば、さらに「DLL を使用するコンポーネントを手動で初期化するための変更」の

    • DLL のコンシューマはマネージ コードを使用でき、DLL には DLL エクスポートまたはマネージ エントリ ポイントが含まれている。

    の手順も行わなければならないようですが、これを行わないとどのような問題があるのでしょうか?

    また、この手順の最後の、

    2. DLL を参照する前と DLL の使用を終了した後に、次の関数を呼び出します。 main にある初期化および終了のメンバ関数を呼び出します。

    は具体的に何をすればよいのかよく分かりません。
    "ijwdll.dll" が今回の場合の "sampleWrapper.dll" のことだとすると、それを利用するアプリ側に記述するのだろうとは思いますが…
    推測ですが、例えばアプリ側 (C#) で、sampleWrapper.dll が公開するラッパークラスのコンストラクタやラッパーメソッドを呼び出す前と後で以下のようにすればよいのでしょうか?

    int retval = 0;
    retval += ManagedWrapper::minitialize();
    if (0 < retval)
    {
     // 例外
    }
    SampleWrapperClass swc = new SampleWrapperClass();
    retval += ManagedWrapper::mterminate();
    if (0 < retval)
    {
     // 例外
    }

    とか、

    int retval = 0;
    retval += ManagedWrapper::minitialize();
    if (0 < retval)
    {
     // 例外
    }
    swc.Hogehoge()
    retval += ManagedWrapper::mterminate();
    if (0 < retval)
    {
    // 例外
    }

    とか?

    C++ はあまり使ったことがないので的外れなところもあるかもしれませんが、よろしくお願いします。

    2006年12月5日 8:17