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

时间:2019-04-01 08:48:03

标签: c# c++ dll

我有一个用C#编写的dll,我在我的c ++代码(正是MFC)中使用了该dll。我可以使用具有返回值int,字符串的dll函数。但是我需要使用具有返回值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

1 个答案:

答案 0 :(得分:1)

您将必须具有在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#lib之后,应该有一个tlb文件。将其导入c ++:

#import "path\to\lib.tlb"

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

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

您还可以将所有功能包装在C ++类中。这当然会增加工作量,并使您必须保留两个相似的代码(真实类和包装类)。但是使用起来可能会更友好。

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