似乎必须有一个重复的问题,但我还没有找到它。
我正在编写一个桥,让一个旧的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'%'只能应用于ref类的实例或值类型。
足够公平。因此,如果我创建int
,我可以使用%
??
int foo;
str = TheObject::GetNameAndValue(%ix);
没有骰子。 C3071再次。我觉得奇怪,因为int
肯定 是一个值类型。或者是吗?
必须有一些魔法组合%,^,&或其他一些淫秽会做我想做的事情,但是在对这件事发誓30分钟后我才难倒。在Google上搜索C ++ / CLI和C#的不同组合,主要提供了有关如何从C#调用C ++的信息。
所以,我的问题:如何将int
从C ++ / CLI传递给期望out int
(或ref int
的C#方法,如果必须的话)?
答案 0 :(得分:5)
C#:
class MyClass
{
public static string GetNameAndValue(out int value);
}
C ++ / CLI:
int value;
String^ x = MyClass::GetNameAndValue(value);
C ++ / CLI包装器:
CString GetNameAndValue(int* value)
{
String^ x = MyClass::GetNameAndValue(*value);
return CString(x);
}
C ++ / CLI包装器2:
CString GetNameAndValue(int& value)
{
String^ x = MyClass::GetNameAndValue(value);
return CString(x);
}
C#“ref”也一样。
答案 1 :(得分:0)
我知道这已经得到了回答,但只是为了澄清编译器建议的内容“C2664:无法将参数2从'int *'转换为'int%'”。
我认为它想要这个(C ++ / CLI):
int a=5
int% foo=a;
str = TheObject::GetNameAndValue(foo);