Bagikan melalui


Cara: Membuat Pembungkus Secara Manual

Jika Anda memutuskan untuk mendeklarasikan jenis COM secara manual dalam kode sumber terkelola, tempat terbaik untuk memulainya adalah file atau pustaka jenis Interface Definition Language (IDL) yang sudah ada. Ketika Anda tidak memiliki file IDL atau tidak dapat menghasilkan file pustaka jenis, Anda dapat mensimulasikan jenis COM dengan membuat deklarasi terkelola dan mengekspor rakitan yang dihasilkan ke pustaka jenis.

Untuk mensimulasikan jenis COM dari sumber terkelola

  1. Deklarasikan jenis dalam bahasa yang sesuai dengan Common Language Specification (CLS) dan kompilasikan filenya.

  2. Ekspor rakitan yang berisi jenis dengan Pengekspor Pustaka Jenis (Tlbexp.exe).

  3. Gunakan pustaka jenis COM yang diekspor sebagai dasar untuk mendeklarasikan jenis terkelola berorientasi COM.

Untuk membuat pembungkus yang dapat dipanggil runtime (RCW)

  1. Dengan asumsi bahwa Anda memiliki file IDL atau file pustaka jenis, tentukan kelas dan antarmuka mana yang ingin Anda sertakan dalam RCW kustom. Anda dapat mengecualikan jenis apa pun yang tidak ingin Anda gunakan secara langsung atau tidak langsung dalam aplikasi Anda.

  2. Buat file sumber dalam bahasa yang sesuai dengan CLS dan deklarasikan jenisnya. Baca Ringkasan Konversi Pustaka Jenis ke Rakitan untuk penjelasan lengkap tentang proses konversi impor. Secara efektif, saat Anda membuat RCW kustom, Anda secara manual melakukan aktivitas konversi jenis yang disediakan oleh Pengimpor Pustaka Jenis (Tlbimp.exe). Contoh di bagian berikutnya menunjukkan jenis dalam IDL atau file pustaka jenis dan jenis yang sesuai dalam kode C#.

  3. Saat deklarasi selesai, kompilasikan file sambil Anda meng-kompilasi kode sumber terkelola lainnya.

  4. Sama halnya dengan jenis yang diimpor dengan Tlbimp.exe, beberapa file memerlukan informasi tambahan yang dapat Anda tambahkan langsung ke kode Anda. Untuk detailnya, baca Cara: Mengedit Rakitan Interop.

Contoh

Kode berikut menunjukkan contoh antarmuka ISATest dan kelas SATest di IDL dan jenis yang sesuai dalam kode sumber C#.

IDL atau file pustaka jenis

 [  
object,  
uuid(40A8C65D-2448-447A-B786-64682CBEF133),  
dual,  
helpstring("ISATest Interface"),  
pointer_default(unique)  
 ]  
interface ISATest : IDispatch  
 {  
[id(1), helpstring("method InSArray")]
HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum);  
 };  
 [  
uuid(116CCA1E-7E39-4515-9849-90790DA6431E),  
helpstring("SATest Class")  
 ]  
coclass SATest  
 {  
  [default] interface ISATest;  
 };  

Pembungkus dalam kode sumber terkelola

using System;  
using System.Runtime.InteropServices;  
using System.Runtime.CompilerServices;  
  
[assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")]  
[assembly:ImportedFromTypeLib("SAServerLib")]  
namespace SAServer  
{  
 [ComImport]  
 [Guid("40A8C65D-2448-447A-B786-64682CBEF133")]  
 [TypeLibType(TypeLibTypeFlags.FLicensed)]  
 public interface ISATest  
 {  
  [DispId(1)]  
  //[MethodImpl(MethodImplOptions.InternalCall,  
  // MethodCodeType=MethodCodeType.Runtime)]  
  int InSArray( [MarshalAs(UnmanagedType.SafeArray,  
      SafeArraySubType=VarEnum.VT_I4)] ref int[] param );  
 }
 [ComImport]  
 [Guid("116CCA1E-7E39-4515-9849-90790DA6431E")]  
 [ClassInterface(ClassInterfaceType.None)]  
 [TypeLibType(TypeLibTypeFlags.FCanCreate)]  
 public class SATest : ISATest  
 {  
  [DispId(1)]  
  [MethodImpl(MethodImplOptions.InternalCall,
  MethodCodeType=MethodCodeType.Runtime)]  
  extern int ISATest.InSArray( [MarshalAs(UnmanagedType.SafeArray,
  SafeArraySubType=VarEnum.VT_I4)] ref int[] param );  
 }  
}  

Lihat juga