0

我最近一直在从事 COM 互操作方面的工作。阅读 Nishant Shivakumar 所著的 C++/CLI in Action 相关书籍。我还浏览了Srinivas的这个链接,其中他很好地解释了如何使用 C++/CLI 在本机 C++ 中使用 C# 库。我下载了页面底部的代码..阅读它..并且喜欢它。我的应用程序很松散基于它。虽然在那个例子中我有一个问题(你可以在那里下载它)。在 C# 库“Worker.cs”中,如果我在 Worker 类中有一个方法,其签名如下:

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

仅供参考:: 我需要 object 参数,因为我将从 Worker Class 中的该类访问一个方法。

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

__declspec dllexport void GetStudent(ManagedStudent^ obj)

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

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

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

4

1 回答 1

0

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

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

  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

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

于 2013-06-01T08:30:18.817 回答