将对象作为参数传递给c / CLI Wrapper函数以导出到本机Win32 dll

时间:2013-06-01 07:32:08

标签: c# com c++-cli native wrapper

我最近一直在COM互操作方面工作。阅读一些关于它的好书C ++ / CLI in Action作者:Nishant Shivakumar。我还通过Srinivas浏览了这个链接,其中他精美地解释了如何使用C ++ / CLI在本地C ++中使用C#库。我下载了页面底部的代码。阅读它...并且喜欢它。我的申请基于它。我在那个例子中有一个问题(你可以在那里下载)。  在C#Library“Worker.cs”中,如果我在Worker类中有一个方法,其签名类似于::

public void GetStudent(ManagedStudent student,int ){....}

FYI ::我需要object参数,因为我将在Worker类中访问该类的方法。

在C ++ / CLI包装器项目NativeInterface.h中,我想导出一个方法,该方法将此托管对象作为参数与示例不同。

__declspec dllexport void GetStudent(ManagedStudent^ obj)

C ++ / CLI中对象的等价物是什么?

后来我想通过在我的本机Win32应用程序/ DLL中传递一个对象来导入此方法来访问此方法。 我在我的原生dll / App中包含了“NativeInterface.h”文件。但是在构建dll / App时出现错误.. 托管目标代码需要\ clr选项

FYI :: 1.我的WIN32 dll / app正在编译时没有\ clr支持和我的包装器\ clr支持 2.我认为错误是因为用作参数的句柄?我想在本机app / dll中访问UnmanagedStudent(Object obj); 这可能吗

1 个答案:

答案 0 :(得分:0)

这是可能的,但你不能将.NET对象传递给本机DLL,这是一个本机C ++代码...... 原生C ++中.NET对象的等价物是C ++对象......但这就像要求C#理解Native或PHP,或者.... 所以,有几种方法。

不要使用C ++托管包装器。而是使用Marsahling和C#互操作性直接调用本机C ++,有两种方式之一:

  1. 将对象字段作为一长串参数传递给C ++,并在本机C ++中重新构造对象。有点“不好”的方法,但非常有效且易于调试。
  2. 您也可以直接将对象作为类指针传递给C ++本机,首先需要在C#中创建正确的编组。看这里: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal(v=vs.110).aspx
  3. 使用C ++ Interop(你正在做的......)。你需要用混合模式编译!看到这个很好的例子: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/f2de75c5-50a6-41ac-9ddf-694a8c0ce75b/ 但是......你需要了解基础知识并知道如何编译它: http://msdn.microsoft.com/en-us/library/x0w2664k.aspx

    互操作性是一个复杂的问题......我试着写一个简短的答案,请转回给我进一步澄清....