将本机C ++类公开给VB.NET

时间:2013-10-09 13:56:05

标签: c++ .net vb.net com wrapper

对于我的项目,UI端代码已经有了更新。它已从VB6转换为VB.NET。因此,我想改变UI端代码与我的引擎端代码的交互方式。

目前,引擎端代码是一个COM对象,其生成如下:

_engine = CreateObject("MyEngine")

我想改变它,以便它将引擎加载为.NET程序集。类似的东西:

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

为了实现这一点,我修改了使用CEngine编译的本机C ++ /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
};

Wrapper.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程序集。

1 个答案:

答案 0 :(得分:1)

我对COM互操作的经验相对较少,但根据我的经验,你可以在你的项目中添加对COM DLL的引用,并自动运行tlbimp.exe,创建一个COM互操作程序集(一个具有运行时的托管程序集)所有COM类的可调用包装器。)

查看此页面:http://msdn.microsoft.com/en-us/library/697w37zd.aspx

我在一些项目中使用过这种方法。