Ich habe eine WinForms C#-Anwendung, die das Google Earth(GE)-Plugin einbettet. Dies geschieht über COM Interop, indem ein Verweis auf das Google Earth Plugin hinzugefügt wird.
Wir würden gerne verschiedene Versionen des GE-Plugins unterstützen, wenn wir unsere Anwendung bereitstellen. Wir referenzieren und erstellen unsere Anwendung mit der Version 5.0 des GE-Plugins auf einem Entwicklungsrechner und stellen sie dann auf einem anderen Rechner bereit, auf dem die Version 6.0 des GE-Plugins installiert ist, und lassen die Anwendung unter Verwendung der Typäquivalenz laufen.
Nach meinem Verständnis von Type Embedding und Type Equivalence in C# 4.0, ist dies genau das, was Type Equivalence Adresse. Allerdings habe ich nicht in der Lage, dies zu bekommen, um zu arbeiten.
Ich füge eine Referenz auf das Google Earth Plugin 5.2 in Visual Studio 2010 als COM-Referenz hinzu. Ich wähle die 'Embed Interop Types'.
Anschließend führe ich die Anwendung auf einem Rechner aus, auf dem das 6.0 GE Plugin installiert ist.
Ich erhalte eine Ausnahme, wenn ich die folgende Codezeile ausführe
string pluginVersion = ge.getPluginVersion();
wobei ge definiert ist als
private IGEPlugin ge;
und 'IGEPlugin' ist eine von der COM Interop definierte Schnittstelle für die GE Plugin DLL.
System.AccessViolationException wurde vom Benutzercode nicht behandelt Message=Versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass >anderer Speicher beschädigt ist.
Die Ausnahme ist anders, wenn sie umgekehrt wird (erstellt mit 6.0, ausgeführt gegen Version 5.2)
Der Code und die Anwendung funktionieren einwandfrei, wenn sie mit der gleichen Version des GE-Plugins erstellt und ausgeführt werden.
Ich bin mir also nicht sicher, was ich übersehe. Aus der MSDN-Dokumentation geht hervor, dass es automatisch funktionieren sollte.
Typenäquivalenz und eingebettete Interop-Typen
Ich hatte wirklich gehofft, zu vermeiden, auf die Verwendung von C# 4.0 "dynamisch" überall zu wechseln, um Kompatibilität über GE Plugin-Versionen zu erhalten, da ich alle Intellisense verlieren, und würde eine Menge Code ändern müssen.