C#传递String^参数到CLR修改后C#侧值不生效如何解决?
问题原因
你现在的写法不生效是两个核心原因共同导致的:
- .NET 中的
System.String是不可变类型,实例创建后内容就无法修改,你能做的只有让变量指向一个新的字符串实例 - 当前你用的
void changeString(System::String^ message)是按值传递跟踪句柄:相当于把C#侧myString变量存储的实例地址拷贝了一份给CLI函数的message参数,你在函数内修改message的指向,仅修改了副本的内容,完全不会影响C#侧原变量的指向,所以外部看不到变更。
可行实现方案
有两种常规实现方式,按需选择即可:
方案1:用返回值返回新字符串(最推荐)
符合.NET字符串不可变的设计约定,逻辑清晰无歧义:
- 调整C++/CLI函数声明和实现:
System::String^ changeString(System::String^ message) { // 你的业务逻辑处理 return "New Message"; // 或 return gcnew System::String("New Message"); 效果一致 }
- C#侧调用时重新赋值给原变量即可:
string myString = "This should be gone"; myString = CLI_Wrapper_Object.changeString(myString);
方案2:用跟踪引用传递参数(对应C# ref/out参数)
如果你必须用无返回值的函数签名,可以通过传递变量引用来实现同步修改:
- 调整C++/CLI函数声明,给参数加
%跟踪引用标记:
void changeString(System::String^% message) { message = "New Message"; }
- C#侧调用时加
ref关键字标记传引用:
string myString = "This should be gone"; CLI_Wrapper_Object.changeString(ref myString);
如果参数仅作为输出不需要传入初始值,还可以给C++/CLI参数加[System::Runtime::InteropServices::Out]特性,C#侧就可以用out关键字调用,无需提前初始化变量。
内容的提问来源于stack exchange,提问作者CalvinSchulze
相关产品推荐
相关产品推荐

