更改从 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);
我有一个 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);