P / Invoke dan .NET Target Framework [duplikat]
Masalah ini mendorong saya ke dinding ... Hanya mengatakan.
Perusahaan saya memiliki pustaka C ++ warisan dan saya telah ditugaskan untuk membuat pembungkus NET.
Saya tidak memiliki pengalaman C ++ atau P / Invoke jadi untuk memulai dengan saya mencoba metode sederhana.
Saya telah membaca dokumentasi resmi dan saya juga menemukan tutorial yang bagus .
Namun, saya telah menemukan bahwa target .NET framework dari aplikasi yang mengonsumsi membuat perbedaan.
Kode P / Invoke dari tutorial berfungsi dengan baik tetapi saya perhatikan bahwa dia menargetkan Profil Klien .NET Framework 4 .
Jika saya menempatkan break point maka mereka terkena dan semuanya bekerja seperti yang diharapkan, jika saya menargetkan kerangka kerja yang lebih tinggi dari 4 maka program akan crash tanpa terkecuali.
Saya memiliki metode yang sangat sederhana yang didefinisikan dalam C ++:
framework.h
extern "C" {
API char* SayHello();
}
dllmain.cpp
char* SayHello() {
return (char*)"Hello";
}
C#
[DllImport("PInvokeTest.dll")]
public static extern string SayHello();
(Saya telah mencoba mengatur CallingConvention dan CharSet pada atribut dalam kombinasi yang berbeda, saya telah berhasil mendapatkan karakter bahasa Mandarin, tetapi tidak ada yang berfungsi lebih tinggi dari Framework 4)
Proyek C ++ saya telah API=__declspec(dllexport)
menetapkan Definisi Preprocessor dan Konvensi Panggilan _stdcall (\Gz)
(Saya juga telah mencoba _cdecl).
Proyek C # berfungsi dengan baik pada Framework 4 , ketika saya mengubah apa pun di atas itu maka itu hanya keluar tanpa kecuali.
Saya juga menemukan Dependensi GUI yang menunjukkan bahwa SayHello
memang ada.
Perusahaan kami menggunakan 4.6.1, saya juga menemukan artikel ini yang membawa saya ke PInvokeStackImbalance tetapi itu tidak melakukan apa pun dalam kasus saya.
Bantuan apa pun akan sangat dihargai.
Saya bisa membuat repo GitHub temp jika diperlukan.
Jawaban
Sekarang saya tahu ini adalah masalah string, saya melakukan sedikit pencarian dan saya menemukan pertanyaan SO ini .
Jadi pada akhirnya saya menggunakan BSTR
pendekatan tersebut.
BSTR SayHello() {
return ::SysAllocString(L"Hello");
}
[DllImport("DBReplicator.Lib.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string SayHello();
... Masih tidak tahu bagaimana saya bisa mendapatkan karakter Cina.