Pertanyaan Apakah file * .tlb pernah digunakan saat runtime?


Saya sedang mengerjakan produk yang memaparkan beberapa API .NET melalui COM interop. Sebagai bagian dari pembuatan, kami menghasilkan file * .tlb untuk semua rakitan dan mengirimkannya sebagai bagian dari paket SDK terpisah. Pelanggan kami dapat menginstal SDK di atas produk kami dan membuat aplikasi yang menggunakan API COM kami.

Apakah kita perlu mengirim dan mendaftarkan file * .tlb itu dengan produk itu sendiri? Apakah ada situasi ketika * .tlb diperlukan saat runtime, ketika pustaka pihak ketiga yang dikodekan terhadapnya dieksekusi?

Tolong jelaskan bagaimana cara kerjanya, jika Anda menjawab Ya. Saya melihat banyak komentar di internet yang mengatakan bahwa saya harus mengantarkan dan mendaftarkannya, tetapi saya tidak menemukan satu yang dengan jelas menjelaskan mengapa itu harus dilakukan. Itu membuat saya ragu bahwa itu benar.


32
2018-01-09 20:16


asal


Jawaban:


Ya, itu mungkin. Khususnya dalam kasus .NET, Anda tidak boleh melewatkan mendaftarkan pustaka jenis karena Anda tidak dapat memprediksi bagaimana kode klien akan menggunakan server Anda.

Mereka tidak terlalu umum tetapi ada dua kasus:

  • Ketika kode klien memanggil metode [ComVisible] Anda dan panggilan melewati batas apartemen. Apartemen adalah konsep COM yang agak kabur, Anda harus memahami perbedaan antara STA dan MTA. Menjaga agar tetap sederhana: batas apartemen biasanya dilintasi saat panggilan dibuat dari utas lain, dari proses lain atau dari komputer lain. COM membutuhkan bantuan untuk mencari tahu bagaimana cara membuat serial argumen panggilan ke dalam paket IPC dan yang membutuhkan mengetahui jenis argumen. Tidak ada konsep Refleksi dalam COM sehingga tidak mudah dilakukan secara otomatis. Sebuah DLL terpisah diperlukan yang mengimplementasikan proxy dan stub, hampir selalu dihasilkan dari file IDL. Itu sulit didapat. NET, Anda hampir selalu menggunakan cara kedua yang nyaman, menggunakan marshaller standar yang dibangun pada Windows. Yang menggunakan pustaka tipe untuk mencari tahu jenis argumennya. Opsi Regasm.exe / tlb memastikan bahwa antarmuka proxy / rintisan dan pustaka jenis terdaftar sehingga marshaller standar dapat menemukan pustaka.

  • Ketika Anda mengekspos struct di antarmuka publik Anda. Structs sangat merepotkan dalam skenario interop, mereka memiliki tata letak yang sangat tergantung pada pengaturan kompilator. Properti .NET yang setara adalah StructLayout.Pack. Tetap di 8 di. NET tetapi kode klien tidak tahu itu. Untuk mengakses struct, kode klien harus menggunakan IRecordInfo. Yang memungkinkannya mencari tahu di mana setiap bidang struct terletak di memori. Sebuah pustaka tipe menyediakan info yang dibutuhkan oleh IRecordInfo. Yang terbaik adalah menghindari struct sepenuhnya dan sangat mudah dilakukan di .NET.


32
2018-01-09 21:19



Saya menghadapi masalah saat mendaftar. Net dll yang menggunakan komponen COM sebagai referensi .tlb.

Jadi Anda tidak perlu mendaftar. Net dll (proyek .tlb).

Saya berharap ini akan berhasil.


0
2017-08-21 15:30