Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Deklarieren Sie die Typen in einer Sprache, die mit der Common Language Specification (CLS) kompatibel ist, und kompilieren Sie die Datei.
Exportieren Sie die Assembly, die die Typen mit dem Typbibliotheksexporteur (Tlbexp.exe) enthält.
Verwenden Sie die exportierte COM-Typbibliothek als Grundlage zum Deklarieren von COM-orientierten verwalteten Typen.
Erstellen Sie einen Runtime Callable Wrapper (RCW)
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.
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.
Wenn die Deklarationen abgeschlossen sind, kompilieren Sie die Datei beim Kompilieren eines anderen verwalteten Quellcodes.
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 );
}
}