Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将普通C#对象传递给C++;并对该对象调用一个方法 我想把一个C类的对象传递给C++,而在本地C++代码中,希望调用这个传递对象的一些方法。p> Public class MyClass{ { bool IsThisValid() { IsValid(this);//Check the Native passing it this object } [DllImport("mylibraryinCpp.dll", EntryPoint="IsValid", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall) ] static internal extern bool IsValid(object); }//end of class 现在,希望C++代码获得这个对象并对其执行一些操作。 在本机C++代码中,我的签名为 //Native C++ code mylibraryinCpp.dll extern "C" __declspec(dllexport) BOOL __stdcall IsValid (VARIANT theObject) { ((mscorlib::_object*)(thObject.pdispVal))->get_ToString(bstrStringVal);//AccessViolationException occurs here. }_C#_C++_Interop - Fatal编程技术网

将普通C#对象传递给C++;并对该对象调用一个方法 我想把一个C类的对象传递给C++,而在本地C++代码中,希望调用这个传递对象的一些方法。p> Public class MyClass{ { bool IsThisValid() { IsValid(this);//Check the Native passing it this object } [DllImport("mylibraryinCpp.dll", EntryPoint="IsValid", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall) ] static internal extern bool IsValid(object); }//end of class 现在,希望C++代码获得这个对象并对其执行一些操作。 在本机C++代码中,我的签名为 //Native C++ code mylibraryinCpp.dll extern "C" __declspec(dllexport) BOOL __stdcall IsValid (VARIANT theObject) { ((mscorlib::_object*)(thObject.pdispVal))->get_ToString(bstrStringVal);//AccessViolationException occurs here. }

将普通C#对象传递给C++;并对该对象调用一个方法 我想把一个C类的对象传递给C++,而在本地C++代码中,希望调用这个传递对象的一些方法。p> Public class MyClass{ { bool IsThisValid() { IsValid(this);//Check the Native passing it this object } [DllImport("mylibraryinCpp.dll", EntryPoint="IsValid", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall) ] static internal extern bool IsValid(object); }//end of class 现在,希望C++代码获得这个对象并对其执行一些操作。 在本机C++代码中,我的签名为 //Native C++ code mylibraryinCpp.dll extern "C" __declspec(dllexport) BOOL __stdcall IsValid (VARIANT theObject) { ((mscorlib::_object*)(thObject.pdispVal))->get_ToString(bstrStringVal);//AccessViolationException occurs here. },c#,c++,interop,C#,C++,Interop,上面的代码大部分时间都在工作,但有时会给出AccessViolationException,其他内存可能已损坏的消息。 我对此很陌生,所以不确定这是从C到C++传递对象的正确方法吗? 感谢您的建议垃圾收集器可能会移动该对象。通常,您只需传递一个指向本机代码的函数指针—它可以由JIT从.NET中的委托生成—这肯定有效。这称为反向P/Invoke。垃圾收集器可能会移动该对象。通常,您只需传递一个指向本机代码的函数指针—它可以由JIT从.NET中的委托生成—这肯定有效。这被称为反向P/Invoke。对

上面的代码大部分时间都在工作,但有时会给出AccessViolationException,其他内存可能已损坏的消息。 我对此很陌生,所以不确定这是从C到C++传递对象的正确方法吗?
感谢您的建议

垃圾收集器可能会移动该对象。通常,您只需传递一个指向本机代码的函数指针—它可以由JIT从.NET中的委托生成—这肯定有效。这称为反向P/Invoke。

垃圾收集器可能会移动该对象。通常,您只需传递一个指向本机代码的函数指针—它可以由JIT从.NET中的委托生成—这肯定有效。这被称为反向P/Invoke。

对象不是被封送了吗?@svick:No..NET生成一个新函数,其中静态包含一个对象引用,然后传递该函数指针。非常有效。感谢@DeadMG,这个反向P/Invoke是否适用于非静态函数?我能否说调用这个对象实例的“xyz”方法?使用P/Invoke我能够实现所需的功能。谢谢你的建议。然而,为什么在一个奇怪的情况下,对象得到GCd,而在其他情况下,它一直工作良好,这仍然困扰着我。有没有什么方法可以避免这种情况,这样我就不必改变我的实现方式?或者有没有办法确定对象确实得到了GCed,这就是问题的原因?@Prakash:GC是不确定的——它可以随时收集。反向P/Invoke对成员函数很好,是的。对象是否被封送?@svick:No..NET生成一个新函数,其中静态包含一个对象引用,然后传递该函数指针。非常有效。感谢@DeadMG,这个反向P/Invoke是否适用于非静态函数?我能否说调用这个对象实例的“xyz”方法?使用P/Invoke我能够实现所需的功能。谢谢你的建议。然而,为什么在一个奇怪的情况下,对象得到GCd,而在其他情况下,它一直工作良好,这仍然困扰着我。有没有什么方法可以避免这种情况,这样我就不必改变我的实现方式?或者有没有办法确定对象确实得到了GCed,这就是问题的原因?@Prakash:GC是不确定的——它可以随时收集。反向P/Invoke对成员函数很好,是的。