0

私のプロジェクトでは、UI 側のコードが更新されました。VB6からVB.NETにコンバートしました。このため、UI 側のコードがエンジン側のコードと対話する方法を変更したいと考えています。

現在、エンジン側のコードは、次のように生成される COM オブジェクトです。

_engine = CreateObject("MyEngine")

エンジンを .NET アセンブリとしてロードするように、これを変更したいと思います。何かのようなもの:

Dim asm As Reflection.Assembly = Reflection.Assembly.LoadFrom("MyEngine.dll")
_engine = asm.CreateInstance("TestEngine")

これを実現するために、ネイティブ C++CEngineクラスを でコンパイルするように変更しました/clr。いくつかのプロジェクト設定をいじった後、正常にコンパイルされました。

次の部分は私の問題です (私はこれについてほとんど経験がありません)。.NET で「表示」する必要があります。したがって、オンラインで読むと、ネイティブクラスを「ラップ」するマネージドクラスを作成するのが最善の解決策のようです。

これが私の小さなラッパーのコードです...あまり複雑ではありません:

Wrapper.h

public ref class TestEngine
{
public:
    TestEngine(void);
    virtual ~TestEngine(void);
protected:
    !TestEngine(void);
private:
    CEngine *_engine; // native (COM) c++ object pointer
};

ラッパー.cpp

#include "Wrapper.h"
TestEngine::TestEngine(void)
{
    _engine = new CEngine();
}

TestEngine::~TestEngine(void)
{
    if (_engine)
    {
        delete _engine;
        _engine = NULL;
    }
}

TestEngine::!TestEngine(void)
{
    if (_engine)
    {
        delete _engine;
        _engine = NULL;
    }
}

したがって、ここでのエラーは、COM メソッド (QueryInterface、AddRef、および Release) が抽象的であるため、CEngine をインスタンス化できないということです。私の質問は、このクラスを派生させ、派生クラスをインスタンス化する必要があるかどうかです。私はここで正しい道を進んでいますか?私の主な目標は、可能であれば、UI コードとエンジン コードの間の管理されていない/管理されている境界を取り除くことです。そのため、内部で COM を使用するのをやめ、代わりに .NET アセンブリをロードします。

4

1 に答える 1

1

私は COM 相互運用の経験が比較的少ないですが、私の経験では、COM DLL への参照をプロジェクトに追加するだけで、tlbimp.exe が自動的に実行され、COM 相互運用アセンブリ (ランタイム呼び出し可能なラッパーを持つマネージ アセンブリ) が作成されます。すべての COM クラス)。

このページをチェックしてください: http://msdn.microsoft.com/en-us/library/697w37zd.aspx

私はいくつかのプロジェクトでこのアプローチを使用しました。

于 2013-10-09T14:01:52.930 に答える