簡體   English   中英

C#C ++ / CLR處理ref參數和字符串指針

[英]C# C++/CLR handling ref parameters and string pointers

我正在使用一個C ++ / CLR DLL到我的C#應用​​程序中,並努力將byRef參數傳遞給本機方法,因為本機代碼帶有“&”,但是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*'

如果我從C ++代碼(字符串^&greet)中刪除了“&”,但我必須通過引用將其發送,這將起作用。

我已經成功使用IntPtr成功使用了類似Int32的類型(盡管這是不安全的代碼),但是問題出在字符串和其他復雜類型上。

任何線索都會有所幫助。 謝謝。

好的,這已經通過以下方式解決了:

當我的C ++代碼中的字符串引用參數像Foo(String ^ MyStr)時,我的CLR期望它為string *。

我必須像String ^ 一樣調用它,以便在常規Foo中調用它(參考字符串MyStr)

但是,MANAGED類不會將值傳遞給ref參數,因此我不得不使用temp參數,即:

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%等。

對於問題中的示例,解決方案只是將“&”替換為“%”。

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

希望這可以幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM