Mengakses memori yang dilindungi di C# melalui interop COM

Saya membuat "Plugin" DLL untuk EXE. EXE memanggil fungsi di DLL dengan Objek sebagai parameter, dan melanjutkan dari sana.

Semuanya berfungsi dengan baik dan keren sampai saya membaginya ke utas baru. Kesalahan ini terjadi

Mencoba membaca atau menulis memori yang dilindungi. Hal ini sering kali merupakan indikasi bahwa memori lain rusak.

saat mengeksekusi kode ini pada objek di thread baru:

    protected object GetPropertyValue(object obj, string PropertyName)
    {
        return obj.GetType().InvokeMember(PropertyName, BindingFlags.GetProperty, null, obj, new object[] { });
    }

Di atas sedang mencoba mengakses properti pada objek COM. Mengubah fungsi menjadi 'publik' tidak mempengaruhinya. Namun kodenya berfungsi dengan baik jika saya hanya menggunakan satu utas.

Apa yang terjadi jelas: Thread baru tidak memiliki akses ke variabel di EXE. Bagaimana cara memperbaikinya? Tidak menggunakan thread bukanlah pilihan yang tepat.

Hargai bantuan apa pun


person Lynxy    schedule 25.11.2009    source sumber


Jawaban (1)


Objek COM Anda mungkin ada di STA. Itu berarti Anda perlu mengirim kembali ke thread yang memiliki objek tersebut, dan melakukan panggilan dari sana.

Jika objek COM mendukung threading gratis, maka objek tersebut mungkin berjalan di STA karena metode utama Anda ditandai dengan atribut thread STA.

Alternatifnya, jika Anda mengontrol objek COM, Anda dapat mencoba menjadikannya objek MTA.

Jika demikian, coba hapus atribut tersebut. Namun, jika Anda menggunakan formulir Windows, maka formulir Anda harus dibuat dari thread STA.

person Scott Wisniewski    schedule 25.11.2009
comment
Saya tidak memiliki kendali atas objek COM - person Lynxy; 26.11.2009
comment
Namun Anda memiliki kendali atas thread yang memintanya. Jika itu adalah objek STA com, Anda harus mengaksesnya dari thread pemiliknya (thread tempat objek tersebut dibuat). - person Scott Wisniewski; 27.11.2009
comment
Alternatifnya, coba tambahkan pengaturan thread BG untuk menggunakan STA saat Anda membuatnya. Jika Anda melakukannya, saya yakin CLR akan menangani pengiriman thread untuk Anda (menggunakan loop pesan). Untuk itu panggil saja thread.SetAppartmemtState - person Scott Wisniewski; 27.11.2009
comment
Terima kasih, itu berhasil! Saya membuat utas asli memproksinya - person Lynxy; 27.11.2009