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

C# C++/CLR handling ref parameters and string pointers

本文关键字:字符串 指针 参数 REF CLR 处理 C#C      更新时间:2023-10-16

我正在将C /CLR DLL在我的C#应用中消耗,并且由于本机代码带有"&但是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#应用: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*'

如果我删除"&amp;",则可以使用此功能。从C 代码(String^&amp; ettry(中,但我必须通过参考发送。

我已经成功地使用了INTPTR(尽管作为不安全的代码(使用了INT32之类的类型,但是问题在于字符串和其他复杂类型。

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

好的,这是通过这种方式解决的:

当我的c 代码中的字符串ref参数就像foo(字符串^ mystr(时,我的CLR期望它为字符串*。

我必须称其为字符串^才能在常规foo(ref string mystr(

中称为

但是,托管类不会将值传递给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%,短%等。

至于问题中的例子,解决方案只是替换了"&amp;"用"%"。

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

希望这会有所帮助...