Anleitung: Wrapper manuell erstellen

Note

Dieser Leitfaden ist spezifisch für .NET Framework. Verwenden Sie für moderne .NET COM-Interoperabilität quellgenerierte COM-Interoperabilität oder die System.Runtime.InteropServices.ComWrappers API. Weitere Informationen finden Sie unter COM-Interopübersicht und COM-Quellgenerierung.

Wenn Sie com-Typen manuell im verwalteten Quellcode deklarieren möchten, empfiehlt es sich, mit einer vorhandenen IDL-Datei (Interface Definition Language) oder Typbibliothek zu beginnen. Wenn Sie nicht über die IDL-Datei verfügen oder keine Typbibliotheksdatei generieren können, können Sie die COM-Typen simulieren, indem Sie verwaltete Deklarationen erstellen und die resultierende Assembly in eine Typbibliothek exportieren.

Simulieren von COM-Typen aus verwalteter Quelle

  1. Deklarieren Sie die Typen in einer Sprache, die mit der Common Language Specification (CLS) kompatibel ist, und kompilieren Sie die Datei.

  2. Exportieren Sie die Assembly, die die Typen mit dem Typbibliotheksexporteur (Tlbexp.exe) enthält.

  3. Verwenden Sie die exportierte COM-Typbibliothek als Grundlage zum Deklarieren von COM-orientierten verwalteten Typen.

Erstellen Sie einen Runtime Callable Wrapper (RCW)

  1. Wenn Sie über eine IDL-Datei oder eine Typbibliotheksdatei verfügen, legen Sie fest, welche Klassen und Schnittstellen Sie in das benutzerdefinierte RCW aufnehmen möchten. Sie können alle Typen ausschließen, die Sie nicht direkt oder indirekt in Ihrer Anwendung verwenden möchten.

  2. Erstellen Sie eine Quelldatei in einer CLS-kompatiblen Sprache, und deklarieren Sie die Typen. Eine vollständige Beschreibung des Importkonvertierungsprozesses finden Sie unter Zusammenfassung der Konvertierung von Typbibliothek in Assembly. Effektiv führen Sie beim Erstellen eines benutzerdefinierten RCW manuell die Typkonvertierungsaktivität aus, die vom Typbibliotheksimporteur (Tlbimp.exe) bereitgestellt wird. Das Beispiel im nächsten Abschnitt zeigt Typen in einer IDL- oder Typbibliotheksdatei und den entsprechenden Typen im C#-Code.

  3. Wenn die Deklarationen abgeschlossen sind, kompilieren Sie die Datei beim Kompilieren eines anderen verwalteten Quellcodes.

  4. Wie bei den mit Tlbimp.exeimportierten Typen erfordern einige zusätzliche Informationen, die Sie direkt zu Ihrem Code hinzufügen können. Ausführliche Informationen finden Sie unter How to: Edit Interop Assemblies.

Example

Der folgende Code zeigt ein Beispiel für die ISATest Schnittstelle und SATest Klasse in IDL und die entsprechenden Typen im C#-Quellcode.

IDL- oder Typbibliotheksdatei

 [
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;
 };

Wrapper in verwaltetem Quellcode

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 );
 }
}

Siehe auch