[英]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.