【发布时间】:2015-05-13 00:06:23
【问题描述】:
好像肯定有重复的问题,但我一直没找到。
我正在写一个桥来让一个旧的 C 程序访问一些 C# 对象。桥是用 C++/CLI 编写的。
在一种情况下,有一个 C# 函数定义为:
public static string GetNameAndValue(out int value);
我的 C++/CLI 包装函数:
char* GetNameAndValue(int* value);
从 C 调用很容易。但是如何从 C++/CLI 调用 C# 方法?
我首先尝试了显而易见的:
String ^ str;
str = TheObject::GetNameAndValue(value);
这给了我错误 C2664:无法将参数 2 从 'int *' 转换为 'int %'。
好的,那么,GetNameAndValue(%value) 怎么样?这给了我错误 C3071: operator '%' can only be applied to an instance of a ref class or a value-type.
很公平。所以如果我创建一个int 我可以通过%??
int foo;
str = TheObject::GetNameAndValue(%ix);
没有骰子。又是 C3071。我觉得很奇怪,因为int 绝对 是 一个值类型。还是这样?
肯定有 %、^、& 或其他一些淫秽的魔法组合可以满足我的要求,但在这件事上咒骂了 30 分钟后,我被难住了。在 Google 上搜索 C++/CLI 和 C# 的不同组合,主要是提供有关如何从 C# 调用 C++ 的信息。
所以,我的问题:如何将 int 从 C++/CLI 传递给需要 out int(或 ref int,如果我必须)的 C# 方法?
【问题讨论】:
-
你的事情严重倒退了。 C++/CLI 在允许 C 程序调用 C# 方法方面毫无用处。它是一种语言扩展,从托管代码到本机代码。从本机程序运行托管代码需要更大的武器,它必须首先加载和初始化 CLR。这需要 30 多分钟才能解决。
-
@HansPassant:这不是我在很短的时间内工作的经验。我的 C 程序调用一个用 C++/CLI 编译的 DLL,而后者又调用另一个程序集中的 C# 代码。效果很好。据我了解,C++/CLI DLL 加载运行时。无论如何,我已经能够将 C# 代码中的信息返回到 C 代码中。
-
C++/CLI 支持 __declspec(dllexport),这是我能想到的唯一一个可以让你好运的场景。与 Giesecke 的 [DllExport] hack 的想法相同。如发布的那样,您的问题对我来说毫无意义,您遇到的问题是完全正常的。祝你好运。