You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#传递String^参数到CLR修改后C#侧值不生效如何解决?

问题原因

你现在的写法不生效是两个核心原因共同导致的:

  • .NET 中的 System.String 是不可变类型,实例创建后内容就无法修改,你能做的只有让变量指向一个新的字符串实例
  • 当前你用的void changeString(System::String^ message)是按值传递跟踪句柄:相当于把C#侧myString变量存储的实例地址拷贝了一份给CLI函数的message参数,你在函数内修改message的指向,仅修改了副本的内容,完全不会影响C#侧原变量的指向,所以外部看不到变更。

可行实现方案

有两种常规实现方式,按需选择即可:

方案1:用返回值返回新字符串(最推荐)

符合.NET字符串不可变的设计约定,逻辑清晰无歧义:

  1. 调整C++/CLI函数声明和实现:
System::String^ changeString(System::String^ message) {
    // 你的业务逻辑处理
    return "New Message";
    // 或 return gcnew System::String("New Message"); 效果一致
}
  1. C#侧调用时重新赋值给原变量即可:
string myString = "This should be gone";
myString = CLI_Wrapper_Object.changeString(myString);

方案2:用跟踪引用传递参数(对应C# ref/out参数)

如果你必须用无返回值的函数签名,可以通过传递变量引用来实现同步修改:

  1. 调整C++/CLI函数声明,给参数加%跟踪引用标记:
void changeString(System::String^% message) {
    message = "New Message";
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:18:03