我正在使用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。
答案 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) {
希望这会有所帮助......