通过引用从C ++ / CLI传递给C#

时间:2014-05-12 21:58:05

标签: c# c++-cli

似乎必须有一个重复的问题,但我还没有找到它。

我正在编写一个桥,让一个旧的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#方法,如果必须的话)?

2 个答案:

答案 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);