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

Jim*_*hel 8 c# c++-cli

似乎必须有一个重复的问题,但我一直无法找到它.

我正在写一个桥,让旧的C程序访问一些C#对象.该桥是用C++/CLI编写的.

在一种情况下,有一个C#函数定义为:

public static string GetNameAndValue(out int value);
Run Code Online (Sandbox Code Playgroud)

我的C++/CLI包装函数:

char* GetNameAndValue(int* value);
Run Code Online (Sandbox Code Playgroud)

这很容易从C调用.但是如何从C++/CLI调用C#方法?

我首先尝试了明显的:

String ^ str;
str = TheObject::GetNameAndValue(value);
Run Code Online (Sandbox Code Playgroud)

这给了我错误C2664:无法将参数2从'int*'转换为'int%'.

好的,那么,怎么样GetNameAndValue(%value)?这给了我错误C3071:运算符'%'只能应用于ref类的实例或值类型.

很公平.所以,如果我创建一个int我可以传递它%??

int foo;
str = TheObject::GetNameAndValue(%ix);
Run Code Online (Sandbox Code Playgroud)

没有骰子.C3071再次.我觉得奇怪,因为int肯定一种价值型.或者是吗?

必须有一些神奇的组合,%,^,和,或其他一些淫秽会做我想要的,但在这件事发誓30分钟后,我很难过.在Google上搜索C++/CLI和C#的不同组合,主要提供了有关如何从C#调用C++的信息.

所以,我的问题:你如何将intC++/CLI传递给期望out int(或者ref int,如果必须)的C#方法?

Tom*_*lik 5

C#:

class MyClass 
{ 
    public static string GetNameAndValue(out int value);
}
Run Code Online (Sandbox Code Playgroud)

C++/CLI:

int value;
String^ x = MyClass::GetNameAndValue(value);
Run Code Online (Sandbox Code Playgroud)

C++/CLI包装器:

CString GetNameAndValue(int* value)
{
    String^ x = MyClass::GetNameAndValue(*value);
    return CString(x);
}
Run Code Online (Sandbox Code Playgroud)

C++/CLI包装器2:

CString GetNameAndValue(int& value)
{
    String^ x = MyClass::GetNameAndValue(value);
    return CString(x);
}
Run Code Online (Sandbox Code Playgroud)

对于C#"ref"来说也是一样的.

  • 这就像调用C++一样:"void x(int&);" 通过传递变量"int v;".机制是一样的.没有演员.对于编译器,所需的原型与定义的原型相同. (2认同)