C#C ++ / CLR处理ref参数和字符串指针

时间:2018-02-27 12:51:11

标签: c# c++ clr

我正在使用C ++ / CLR DLL到我的C#应用​​程序,并且一直在努力将byRef参数传递给本机方法,因为Native代码附带了"&"但C#提示我需要删除" ref" (或" out")关键字。 而且,论证转化为" "在我的C#和字符串中,例如不能接受该类型,因此我从'字符串'中获得转换错误到'字符串'。

我在本演示中使用了Pavel Yosifovich示例代码:

托管C ++文件:ManagedPerson.cpp

String^ ManagedPerson::SayHello(String^ &greet) {

marshal_context ctx;
return gcnew String(m_pNative->SayHello(ctx.marshal_as<LPCTSTR>(greet)));

}

我的C#App:Main.cs

static void Main(string[] args)
    {
        var person = new ManagedPerson("Bart", 10);

        Console.WriteLine(person.SayHello("Hello "));
    }

然后我在我的C#编译中遇到了这个错误(person.SayHello的原因):

Argument 1: cannot convert from 'string' to 'string*'

如果我删除&#34;&amp;&#34;来自C ++代码(String ^&amp; greet)但我必须通过引用发送它。

我成功地使用IntPtr使用类似Int32的类型(虽然是不安全的代码),但问题在于字符串和其他复杂类型。

任何线索都会有所帮助。 THX。

1 个答案:

答案 0 :(得分:0)

好的,这已经解决了这个问题:

当我的C ++代码中的字符串引用类似于Foo(String ^ MyStr)时,我的CLR期望它为字符串*。

我必须将它称为String ^ 才能在常规Foo中调用它(ref string MyStr)

然而,MANAGED类不会将值传递给ref参数,所以我不得不使用temp params,即:

Void Foo(String^ %MyStr) 
    { 
marshal_context ctx;
    std::wstring temp_MyStr = ctx.marshal_as<std::wstring>(MyStr);
    myCppClass->DoSomthing(temp_MyStr);
    MyStr = temp_MyStr.c_str();
        }

这也指其他类型,如int%,short%等。

至于问题中的例子,解决方案只是取代&#34;&amp;&#34;用&#34;%&#34;。

String^ ManagedPerson::SayHello(String^ %greet) {

希望这会有所帮助......