خطأ PInvoke عندما حشد البنية بسلسلة فيه
-
11-07-2019 - |
سؤال
ولدي C ++ البنية
struct UnmanagedStruct
{
char* s;
// Other members
};
ووC # البنية
struct ManagedStruct {
[MarshalAs(UnmanagedType.LPStr)]
string s;
// Other members
}
وعلى C ++ يفضح مكتبة
extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );
ويتم استيراد عليه
[DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
static extern ManagedStruct foo( string input );
ولكن عندما استدعاء هذه الدالة أحصل
وكان MarshalDirectiveException غير معالج
وتوقيع نوع الأسلوب ليست PInvoke متوافق.
والشيء هو، هذه الدعوة وظيفة يعمل إذا أزيل شار * الصورة وسلسلة الصورة من البنيات.
المحلول
لهذا النوع من السيناريو، لا تستخدم سلسلة مباشرة. بدلا من ذلك تبديل نوع أن تكون قيمة IntPtr واستخدام Marshal.PtrToStringAuto / الانسي / يوني حسب الاقتضاء. في هذه الحالة، لأن التعليمات البرمجية الأصلية يستخدم char*
، PtrToStringAnsi هو الخيار الافضل.
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
لا تنتمي إلى StackOverflow