私のプロジェクトでは、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 アセンブリをロードします。