【问题标题】:Change String^ parameter passed from C# to CLR更改从 C# 传递给 CLR 的 String^ 参数
【发布时间】:2021-10-25 14:47:23
【问题描述】:

我有一个 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# c++-cli clr


    【解决方案1】:

    您尝试做的 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);
    

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多