Die nahtlose Integration von COM-Typen in C# weckt die Neugier der Entwickler. Dieser Artikel befasst sich eingehend mit dem Mechanismus des Compilers zur Erkennung von COM-Typen und zeigt, wie er scheinbar anomale Vorgänge ausführen kann.
Ein rätselhafter Aspekt bei der Handhabung von COM-Typen ist die Art und Weise, wie Schnittstellen wie „Application“ in C# aufgebaut sind. Der C#-Compiler scheint das Aufrufen von Konstruktoren auf Schnittstellen zu ermöglichen, ein Verhalten, das in anderen Sprachen normalerweise verboten ist. Diese Illusion wird erreicht, indem implizit Type.GetTypeFromCLSID() aufgerufen wird, um die richtige COM-Klasse abzurufen, und anschließend Activator.CreateInstance aufgerufen wird, um eine Instanz dieser Klasse zu erstellen.
Darüber hinaus wurde mit C# 4 eine Funktion eingeführt, die es Entwicklern ermöglicht, Nicht-Referenzparameter für Referenzparameter bereitzustellen. Der Compiler erstellt automatisch eine lokale Variable, die als Referenz übergeben wird, wodurch der ursprüngliche Wert effektiv verworfen wird. Der folgende Code veranschaulicht dieses Verhalten:
<code class="language-c#">app.ActiveDocument.SaveAs(FileName: "test.doc");</code>
Der FileName-Parameter ist technisch gesehen ein Referenzparameter, aber der Code übergibt einen konstanten Wert. Der Compiler behandelt diesen Unterschied transparent.
Der Versuch, das erste Szenario zu imitieren (die Schnittstelle direkt zu instanziieren), hat sich als erfolglos erwiesen. Das zweite Szenario kann jedoch mit den Modifikatoren ref und in wie folgt repliziert werden:
<code class="language-c#">Dummy dummy = null; dummy.Foo(in 10);</code>
Im Gegensatz zum erwarteten neuen Dummy()-Konstrukt verwendet dieser Code den Modifikator in, um die Variable als Referenz zu übergeben, ohne ihren Wert zu ändern.
Der Schlüssel dafür, dass der Compiler COM-Typen erkennen kann, ist das CoClass-Attribut. Durch Annotieren einer Schnittstelle mit [CoClass(typeof(Test))] kann der Compiler auf die Existenz der zugrunde liegenden Implementierungsklasse schließen und den notwendigen Code generieren, um sie zu instanziieren.
Diese Entdeckung eröffnet neue Möglichkeiten für die Interaktion mit COM-Typen in C# und verbessert die Interoperabilitätsfähigkeiten der Sprache.
Das obige ist der detaillierte Inhalt vonWie geht der C#-Compiler mit der scheinbar ungewöhnlichen Instanziierung und Parameterübergabe von COM-Typen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!