2016-11-23 9 views
3

Warum ist, dass es Word verwenden Sie definieren eine Variable wie folgt aus:Was ist der Unterschied zwischen _Application und Anwendung ist

Dim Word As Microsoft.Office.Interop.Word._Application 

ODER

Microsoft.Office.Interop.Word._Application Word; 

Dann es wie folgt festgelegt:

Word = New Microsoft.Office.Interop.Word.Application 

ODER

Word = new Microsoft.Office.Interop.Word.Application(); 

Was ist der Unterschied zwischen Anwendung und _Application

Ich vermute, man eine Klasse sein kann und der andere eine Schnittstelle oder man kann öffentlich und der andere privat sein, aber das macht noch keinen Sinn für mich.

Ich hatte gehofft, jemand kann es mir erklären. Je mehr Details, desto besser.

+0

[Anwendung von _Application erbt] (https://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.application.aspx) mit dem zusätzlichen ApplicationEvents_11_Event –

+0

@rory, du hast nur ein Endlosschleife! Ich klicke auf den Link, der mich zu meiner Frage bringt, also klicke ich auf deinen Link, der mich zu meiner Frage bringt. . . – John

+0

@John - Google-Suche Indexierung ist schnell. Klicken Sie auf einen der anderen Links. –

Antwort

8

Beide sind Schnittstellen und die Application Schnittstelle erbt von der _Application Schnittstelle (zusammen mit der ApplicationEvents4_Event Schnittstelle).

Also, wann was zu verwenden? Die Differenz wird erläutert in MSDN (Hervorhebung hinzugefügt):

Application interface:

[GuidAttribute("00020970-0000-0000-C000-000000000046")] 
public interface Application : _Application, 
    ApplicationEvents4_Event 

Dies ist eine .NET-Schnittstelle von einem COM coclass abgeleitet, die von verwalteten Code für die Interoperabilität mit dem entsprechenden erforderlich ist COM-Objekt Verwenden Sie diese abgeleitete Schnittstelle für den Zugriff auf alle Methoden-, Eigenschaften- und Ereigniselemente des COM-Objekts. Wenn jedoch eine Methode oder ein Ereignis denselben Namen unter demselben COM-Objekt verwendet, teilen Sie sie der entsprechenden primären Schnittstelle mit, um die Methode aufzurufen, und wenden Sie sie an die letzte Ereignisschnittstelle, um eine Verbindung mit dem Ereignis herzustellen. In diesem Thema finden Sie Informationen zum COM-Objekt.

_Application interface:

[TypeLibType(4304)] 
[Guid("00020970-0000-0000-C000-000000000046")] 
[ComImport] 
public interface _Application { ... } 

Dies ist eine Hauptschnittstelle in einem COM coclass, die von verwalteten Code für die Interoperabilität mit dem entsprechenden COM-Objekt erforderlich ist. Verwenden Sie diese primäre Schnittstelle nur, wenn die zu verwendende Methode denselben Namen wie ein Ereignis des COM-Objekts hat; In diesem Fall müssen Sie diese Schnittstelle aufrufen, um die Methode aufzurufen, und auf die aktuelle Ereignisschnittstelle umschalten, um eine Verbindung mit dem Ereignis herzustellen. Verwenden Sie andernfalls die .NET-Schnittstelle, die von der COM-Co-Klasse abgeleitet ist, um auf Methoden, Eigenschaften und Ereignisse des COM-Objekts zuzugreifen.

Praktische Konsequenzen

Kurz gesagt: Verwenden Sie Application und nicht _Application in Ihrem Code, es sei denn, Sie müssen, weil es eine Mehrdeutigkeit zwischen einem Methodennamen und einem Ereignisnamen.

Eine solche Mehrdeutigkeit existiert zum Beispiel zwischen dem Application.Quit Ereignis (ausgelöst, wenn die Anwendung beendet wird) und der Application.Quit(ref Object SaveChanges, ref Object OriginalFormat, ref Object RouteDocument) Methode (beendet die Anwendung, wenn sie aufgerufen wird).

Um das Verfahren zu nennen, können Sie einfach schreiben könnte (zB zu beenden, ohne die Änderungen aufgefordert speichern):

Application.Quit(false); 

Dies ist jedoch möglicherweise die folgende Compiler-Warnung geben:

Warnung 3 Ambiguität zwischen Methode 'Microsoft.Office.Interop.Word._Application.Quit (ref-Objekt, ref-Objekt, ref-Objekt)' und nicht-Methode 'Microsoft.Office.Interop.Word.ApplicationEvents4_Event.Quit'. Methodengruppe verwenden

die Warnung zu vermeiden, können Sie das Anwendungsobjekt an die _Application-Schnittstelle umgewandelt:

((_Application)Application).Quit(false); 

Wenn Sie Sie auf das Ereignis abonnieren möchten, müssen Sie das Anwendungsobjekt an das entsprechende Ereignis werfen Schnittstelle:

((ApplicationEvents4_Event)Application).Quit += OnApplicationQuit; 

private void OnApplicationQuit() 
{ 
    // handle event here 
} 
+0

Awesome Antwort. Kurz, präzise, ​​nützlich. – JayC667

7

Es ist eine Art lange Geschichte, mit halsbrecherischem Tempo. COM verwendet ein hyperreines schnittstellenbasiertes Paradigma. Eine Client-Anwendung führt nur Aufrufe von Schnittstellenmembern durch, die "Co-Klasse", die die Schnittstelle implementiert, wird vollständig ausgeblendet. Alles, was offengelegt wird, ist die Leitlinie der Co-Klasse, die CLSID. Dies wird an die universelle Factory-Funktion CoCreateInstance() übergeben, die gewünschte Schnittstelle wird zurückgegeben. Diese Isolierung ist der Hauptgrund dafür, dass COM-Server in einer beliebigen Sprache geschrieben werden können. Keine der Implementierungsdetails ist sichtbar und kann daher niemals mit der von Ihnen verwendeten Sprache inkompatibel sein.

Das Arbeiten mit Schnittstellen war jedoch ein Problem mit frühen VB-Versionen, im Gegensatz zu VB.NET hatten sie keine Unterstützung für Schnittstellen. Also ihre Laufzeit-Unterstützung ausgetrickst und macht es aussehen wie Sie mit einer Klasse arbeiten. Benannt Application in diesem Fall. Die Mitglieder dieser Klasse sind die Mitglieder der Standardschnittstelle, in diesem Fall _Application. Alle Verbindungspunkte von der Standardquellschnittstelle werden als Ereignisse hinzugefügt.

Der führende Unterstrich in _Application ist auch ein Trick, es sagt den Typbibliothekbrowsern, die Schnittstelle zu verstecken. Etwas, was der Objektbrowser in Visual Studio nicht tut, vielleicht ein Grund, warum Sie diese Frage stellen. Eine Sache, die die Trickserei nicht erreichen kann, ist der Umgang mit einer Co-Klasse, die mehrere Schnittstellen implementiert. Aber vom Typ-Designer bemerkt, stellte er sicher, der Co-Klasse nur eine Standardschnittstelle und eine Quellschnittstelle zu geben.

Ähnliche Trickserei war notwendig, um .NET-Programmierern die gleiche Art von API zu geben, so dass sie auch Application verwenden und ihren Code leicht portieren lassen konnten. Dies geschieht durch den Typbibliothekimporter (Tlbimp), es synthetisiert eine zusätzliche Schnittstelle mit demselben Namen wie die Co-Klasse, alle ihre Mitglieder sind genau dieselben wie die Standardschnittstellen.

Dies ist eine Schnittstelle, die VB.NET und C# -Compiler ermöglichen es Ihnen, eine Instanz davon zu erstellen. Ganz im Gegensatz zu dem, was man mit einer normalen Schnittstelle machen kann. Der Importeur auch synthetisiert eine Klasse, der gleiche Name wie die Co-Klasse mit "Class" angehängt. Also ApplicationClass hier. Es implementiert alle der Schnittstellen, die die Co Klasse implementiert. Sie haben keinen praktischen Nutzen dafür in VB.NET und Sie sollten es vermeiden, da die sehr wünschenswerte Funktion "Einbetten von Interop-Typen" die Einbettung nicht unterstützt. Möglicherweise möchten Sie es jedoch in einer Sprache wie F # oder einer Sprache verwenden, die auf .NET portiert wurde, aber keine Schnittstellen unterstützt.

Lange Geschichte kurz, _Application ist die tatsächliche Schnittstelle, die aus der Typbibliothek kam. Aber Sie sollten die synthetisierten Application, beste Übereinstimmung mit allen Code-Samples bevorzugen, die Sie jemals begegnen werden.

Verwandte Themen