传递对象作为c /CLI包装函数的参数,导出到本机Win32 dll

本文关键字:参数 dll Win32 本机 函数 对象 包装 CLI | 更新日期: 2023-09-27 18:16:38

我最近一直在做COM互操作的事情。请阅读Nishant Shivakumar写的有关c++/CLI的好书。我还浏览了Srinivas的链接,他在其中漂亮地解释了如何使用c++/CLI在本地c++中使用c#库。我下载了页面底部的代码,阅读了它,并爱上了它。我的应用程序是松散地基于它。在这个例子中,我有一个问题(你可以在那里下载)。在c#库"Worker.cs"中,如果我在Worker类中有一个签名如下的方法::

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

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

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

__declspec dllexport void GetStudent(ManagedStudent^ obj)

c++/CLI中的对象是什么?

之后我想通过在我的本地Win32 Application/DLL中传递一个对象来导入这个方法来访问这个方法。我包括"NativeInterface.h"文件在我的本机dll/应用程序。但是在构建dll/App时出现错误。托管目标代码需要'clr选项.

供参考:1. 我的WIN32 dll/app正在编译没有'clr支持和我的包装与'clr支持2. 我相信这个错误是因为句柄被用作参数?我想访问UnmanagedStudent(对象obj)在本地应用程序/dll;

传递对象作为c /CLI包装函数的参数,导出到本机Win32 dll

这是可能的,但是您不能将。net对象传递给本机DLL,这是本机c++代码…在原生c++中与。net对象等价的是c++对象…但这就像要求c#理解Native或PHP,或....有几种方法。

不要使用c++托管包装器。而不是使用编排和c#互操作性直接调用本地c++,以两种方式之一:

  1. 将对象字段作为一长串参数传递给c++,并在原生c++中重新构造对象。有点"不太好"的方法,但非常有效,易于调试。
  2. 你也可以将对象作为类指针直接传递给c++本机,你需要首先在c#中创建正确的封送处理。在这里看到的:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal (v = vs.110) . aspx

使用c++互操作(你正在做的…)你需要用混合模式编译!看看这个很好的例子:http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/f2de75c5-50a6-41ac-9ddf-694a8c0ce75b/但是…您需要了解基础知识并知道如何编译它:http://msdn.microsoft.com/en-us/library/x0w2664k.aspx

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