对于我的项目,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 中“可见”。因此,从在线阅读来看,似乎最好的解决方案是创建一个托管类来“包装”我的原生类。
这是我的小包装器的一些代码......没什么太复杂的:
包装器.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;
}
}
所以这里的错误是我无法实例化 CEngine,因为它的 COM 方法(QueryInterface、AddRef 和 Release)是抽象的。所以我的问题是,我应该派生这个类并实例化派生类吗?我什至走在正确的道路上吗?我的主要目标是尽可能摆脱我的 UI 代码和引擎代码之间的非托管/托管边界。因此在内部消除了对 COM 的使用,而是加载了 .NET 程序集。