更改从 C# 传递到 CLR 的 String^ 参数

Change String^ parameter passed from C# to CLR

我有一个 C++ 库,它正在使用 C++ CLI 进行包装。 CLI 库有一个像这样的函数声明:

void changeString(System::String^ message)

在 C# 中我有一个字符串变量,我是这样传递的:

string myString = "This should be gone";
CLI_Wrapper_Object.changeString(myString);

回到 CLI 库,我尝试以下操作:

void changeString (System::String^ message){
   message = "New Message";
}

这似乎会更改 CLI 级别的值,但不会更改 C# 级别的值。我可以看到它肯定是通过调试器更改的,但是当我跳回 C# 时,我又看到了旧的初始值。

我尝试过的其他方式:

message = gcnew System::String("New Message");

是否有可能实现我想要实现的目标?

您尝试执行的 C# 等效操作是:

public void changeString(string message)
{
    message = "New Message";
}

string message = "Foo";
changeString(message);
Console.WriteLine(message); // Prints 'Foo'

那行不通,因为 .NET 中的参数是按值传递的。如果您需要更改调用者看到的变量,则需要将其声明为 ref:

public void changeString(ref string message)
{
    message = "New Message";
}

string message = "Foo";
changeString(ref message);
Console.WriteLine(message); // Prints 'New Message'

C++/CLI 等效项是 %:

void changeString (System::String^% message){
   message = "New Message";
}

然后在 C# 中:

changeString(ref message);