Я боролся с этим некоторое время.Причина, по которой он не работает с «Embed Interop Types», заключается в том, что Google по какой-то причине генерирует совершенно новый GUID для COM-объекта, что означает, что встроенная библиотека взаимодействия больше не будет функционировать, даже если интерфейс точното же самое.
Я только недавно столкнулся с этой проблемой, когда плагин GoogleEarth решил автоматически обновиться, и таким образом нарушил Interop-Compatibility, имея новый COM-GUID.
Я понимаювы не хотите использовать «динамический» везде, так как вы теряете IntelliSense - я бы посоветовал вам использовать ссылку взаимодействия для начальной разработки, чтобы у вас это было на этом этапе со статической типизацией, а затем переключаться на «динамический», как толькодостаточно стабильный, и вы просто хотите убедиться, что он по-прежнему работает с будущими версиями GoogleEarth без исключения приведения.
Я понимаю, что вы уже знаете, как решить эту проблему с помощью "динамического", но я публикую решениеЯ использовал ниже, может быть, другие люди могли бы использовать его.
С c # 4.0 у вас есть простое решение для этого.Я решил эту проблему, НЕ объявляя "ge" как тип "IGEPlugin" и удаляя все ссылки на GoogleEarth в проекте.Вместо этого объявите "ge" следующим образом:
private dynamic ge;
Теперь вы можете вызывать ЛЮБОЙ метод для объекта ge без необходимости, чтобы компилятор знал его точный тип.Это будет решено во время выполнения.Вам просто нужно убедиться, что вы вызываете правильное имя метода с правильными параметрами.
Если вы можете заставить свой проект компилироваться без ЛЮБЫХ ссылок на GEPlugin, вы на правильном пути, это сработалодля меня для любой версии плагина GoogleEarth, как только я изменил ее следующим образом.
Я опубликую класс, который я использую для инкапсуляции плагина, встроенного в элемент управления браузера:
[ComVisible(true)]
public class GoogleEarthWebPluginHolder : IGoogleEarthJS {
dynamic ge = null;
GoogleEarthWebViewer parent;
public GoogleEarthWebPluginHolder(GoogleEarthWebViewer parent) {
this.parent = parent;
}
public dynamic Plugin {
get {
return ge;
}
}
public void JSInitSuccessCallback_(object pluginInstance) {
ge = (dynamic)pluginInstance;
this.parent.JSInitSuccessCallback();
}
public void JSInitFailureCallback_(string error) {
MessageBox.Show("Error: " + error, "Plugin Load Error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
Обратите внимание, что «родительский элемент» в конструкторе - это элемент управления, на котором размещены элемент управления для браузера и плагин.Он получает доступ к держателю плагинов для взаимодействия с GoogleEarth, как только вызывается JSInitSuccessCallback_.Интерфейс для держателя плагинов выглядит следующим образом (больше не уверен, зачем он мне нужен, но все равно все идет):
[ComVisible(true)]
interface IGoogleEarthJS {
void JSInitSuccessCallback_(object pluginInstance);
void JSInitFailureCallback_(string error);
}