Mengakses Kelas C dalam Kod C# melalui DLL
Apabila berinteraksi dengan C DLL daripada kod C#, had timbul apabila cuba mengakses kelas secara terus ditakrifkan dalam DLL. Walaupun keupayaan P/Invoke untuk mendedahkan fungsi, fungsi dalam kelas bergantung pada pembolehubah ahli bukan statik, yang memerlukan penciptaan instance.
P/Invoke dan Akses Tidak Langsung
Sementara terus akses kelas tidak boleh dilaksanakan, P/Invoke boleh digunakan secara tidak langsung untuk mengakses ahli kelas. Pendekatan ini melibatkan penciptaan fungsi bukan ahli yang memanggil fungsi ahli kelas.
Kod Contoh
Pertimbangkan kod C berikut:
class Foo { public: int Bar(); }; extern "C" Foo* Foo_Create() { return new Foo(); } extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); } extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }
Di sini, kod C mendedahkan kelas Foo melalui bukan ahli fungsi.
Pengantaramukaan C#
Dalam C#, P/Invoke boleh mengakses fungsi ini:
[DllImport("Foo.dll")] public static extern IntPtr Foo_Create(); [DllImport("Foo.dll")] public static extern int Foo_Bar(IntPtr value); [DllImport("Foo.dll")] public static extern void Foo_Delete(IntPtr value);
Kod C# kini mesti mengurus nilai IntPtr, yang boleh dibalut dalam kelas pembalut untuk kemudahan.
Alternatif Pendekatan
Jika pemilikan langsung kod C tidak mungkin, DLL berasingan boleh dibuat untuk membalut DLL asal dan menyediakan lapisan P/Invoke, memudahkan interaksi kod C# dengan kelas C.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Kelas C daripada C# Menggunakan P/Invoke?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!