如何从 c++ 代码中使用 c# dll 中定义的类

How to use a class defined in c# dll from c++ code

本文关键字:dll 定义 c++ 代码      更新时间:2023-10-16

我有一个用c#编写的 dll,我在c++代码中使用了这个 dll(正是 MFC)。我可以将 dll 函数与返回值 int、字符串...但是我需要使用带有返回值c#类的函数!我不知道MFC哪种数据类型才能在c#dll 中输入函数的返回值。C#返回值对象在MFC中转换为_variant_t。请帮助我。感谢您阅读我的问题

C# 代码(摘要)

[Guid(" - - - - ")]
public interface ITestClass
{
object Func();
}
[Guid(" - - - - ")]
public class TestClass : ITestClass
{
public object Func()
{
Project1.Class1 data = dataList[0];
return data ;
}
}

MFC 代码(摘要)

ITestClass *ptc = NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_TestClass, NULL, CLSCTX_INPROC_SERVER, IID_ITestClass, reinterpret_cast<void**>(&ptc));
int sum = ptc->Sum(5, 30); // It is perfect
data = ptc->Func(); // I don't know what data type is

您必须在C++中定义相同的类。这有点难,可能是有缺陷的。所以我会尝试使用 CLI。

或者有一种更简单的方法。不要那样做:) 执行,使用旧的,好的机制,如:

int objectHandle = ptc->CreateObject();
int data = ptc->GetSomeIntData(objectHandle);
ptc->DoSomeOperation(objectHandle);
ptc->ReleaseObject(objectHandle);

这个想法是你C++没有一个类。该对象是在 C# 端创建的,并具有其唯一的对象句柄(可能是哈希代码)。在 CreateObject 中返回此句柄,在 C# 端可以将对象存储在字典中:

Dictionary<int, MyClass>

然后在C++端,你用你的objectHandle调用函数。

这是完成相同结果的更简单的方法。

但是如果你真的想使用这个类,你可以试试这个: - 确保 C# 库与 COM 兼容(注册 COM 互操作选项) - 编译 C# 库后,应该有一个 tlb 文件。在 C++ 中导入它:

#import "pathtolib.tlb"

接下来你可以像这样使用它:

CoInitialize(NULL);
ClassNamespace::ITestClassPtr myClass(__uuidof(ClassNamespace::TestClass));
myClass->Func();
CoUninitialize();

您还可以将所有功能包装C++类中。这当然会产生更多的工作,并且使您必须保留两个相似的代码(真正的类和包装器类)。但可能使用起来更友好。

如果你想返回其他类,你必须以类似的方式进行。创建 com 接口,在 c++ 中使用它,并在 c# 中返回它。