我有一个用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
答案 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#中返回。