Montag, 1. April 2013

Wie man eine Instanz von einer Interop-Klasse erstellt

Ich programmiere am liebsten mit C#, aber manchmal bringt es mich dann doch um den Verstand. Jeder der schon einmal versucht hat, mit Visual Studio eine COM-Bibliothek zu referenzieren, wird auf dieses Problem gestoßen sein: Man kann mit dem new-Operator keine Klassen erzeugen. Aber fangen wir mit dem Anfang an.

Wo finde ich Shdocvw.dll?

Ich versuche gerade, eine alte Browser-Bibliothek von Microsoft zu verwenden und habe sie nach einigem Suchen in den Referenzen gefunden. "Shdocvw.dll" ist der Name der Bibliothek, allerdings wird sie nicht so bezeichnet. Die Bezeichnung in den COM-Referenzen ist "Microsoft Internet Controls". Nach dem Hinzufügen taucht diese Bibliothek dann als "Shdocvw" im Projekt auf.

Wie erzeuge ich ein Objekt?

Nun befinden sich dort mehrere interessante Klassen und Interfaces. Mein erster Reflex war, ein Objekt zu erzeugen und dann zu schauen, was es tut:
SHDocVw.WebBrowserClass myBrowser = new SHDocVw.WebBrowserClass();
Das geht so nicht. Der Compiler-Fehler, der bei dieser Gelegenheit auftritt lautet: "Interop type SHDocVw.WebBrowserClass cannot be embedded. Use the applicable interface instead." oder so ähnlich.

In der Fehlermeldung steht es eigentlich bereits: Benutze das Interface! Aber was bedeutet "benutzen"? In jedem besserem C#-Kurs lernt man Factory-Methoden zu verwenden. Also begab ich mich auf die Suche nach einer Factory, jedoch ohne Erfolg. Der Trick ist das Unmögliche:
SHDocVw.WebBrowser myBrowser = new SHDocVw.WebBrowser();
Das Element SHDocVw.WebBrowser ist keine Klasse. Es ist ein Interface. 
Und jeder weiß doch, dass man von Interfaces mit new eigentlich keine Instanzen erzeugen kann.
Nun, man kann. Und ohne dieses Excel-Blog wäre ich wohl nie darauf gekommen.

Keine Kommentare:

Kommentar veröffentlichen