通过引用从c++ /CLI传递int到c#

本文关键字:传递 int CLI 引用 c++ | 更新日期: 2023-09-27 18:03:13

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

我正在写一个桥,让旧的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:操作符'%'只能应用于ref类或值类型的实例。

好了。所以如果我创建一个int,我可以用%传递它??

int foo;
str = TheObject::GetNameAndValue(%ix);

不行。C3071。我觉得很奇怪,因为int肯定一个值类型。是吗?

一定有一些%,^,&或者其他一些下流的东西的神奇组合可以达到我想要的效果,但是在咒骂了30分钟之后,我被困住了。在谷歌上搜索c++/CLI和c#的不同组合,主要是关于如何从c#调用c++的信息。

所以,我的问题:如何将int从c++/CLI传递到期望out int(或ref int,如果我必须的话)的c#方法?

通过引用从c++ /CLI传递int到c#

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 wrapper 2:

CString GetNameAndValue(int& value)
{
    String^ x = MyClass::GetNameAndValue(value);
    return CString(x);
}

对于c# "ref"也是一样。

我知道这已经回答了,但只是为了澄清编译器建议的"C2664:无法将参数2从'int *'转换为'int %'"。
我想它需要这个(c++/CLI):

int a=5
int% foo=a;
str = TheObject::GetNameAndValue(foo);