gpt4 book ai didi

c++ - 将 native C++ 类公开给 VB.NET

转载 作者:行者123 更新时间:2023-11-28 07:22:05 25 4
gpt4 key购买 nike

对于我的项目,已对 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 中“可见”。因此,从在线阅读来看,最好的解决方案似乎是创建一个托管类来“包装”我的 native 类。

这是我的小包装器的一些代码……没什么太复杂的:

包装器.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 程序集。

最佳答案

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

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

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

关于c++ - 将 native C++ 类公开给 VB.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19274133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com