【问题标题】:Expose native C++ class to VB.NET向 VB.NET 公开本机 C++ 类
【发布时间】:2013-10-16 22:28:06
【问题描述】:

对于我的项目,已经更新了 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 程序集。

【问题讨论】:

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


    【解决方案1】:

    我在 COM 互操作方面的经验相对较少,但根据我的经验,您只需将 COM DLL 的引用添加到您的项目中,它就会自动运行 tlbimp.exe,它会创建一个 COM 互操作程序集(具有运行时的托管程序集) -所有 COM 类的可调用包装器)。

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

    我在少数项目中使用过这种方法。

    【讨论】:

    • 谢谢 - 实际上,我认为该项目正在使用一些互操作 dll 作为引擎方法的接口。但无论如何,我的老板希望这些互操作 dll 消失并加载程序集。显然,它们导致项目单元测试失败......
    猜你喜欢
    • 2011-02-05
    • 2013-01-21
    • 2011-02-06
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2010-09-20
    • 2011-03-18
    • 2021-02-06
    相关资源
    最近更新 更多