ObjectForScripting с несколькими интерфейсами не работает
У меня есть WinForm, который взаимодействует с WebBrowserControl через ObjectForScripting. Базовый класс моей WinForm не является ComVisible, и я не могу или не буду его менять. Поскольку существует NonComVisibleBaseClass, я создал интерфейс и установил его ComVisible(true) и установил FormAttribute [ClassInterface(ClassInterfaceType.None)]. Методы в интерфейсе могут быть вызваны JavaScript. И это прекрасно работает:
//Make the class visible for COM so we can set the ObjectForScripting
//Specify ClassInterfaceType.None to use the ComVisible Interface
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public partial class GeekBrowser : GeekBasePage, IMapControlInteractable
...
public class GeekBasePage : System.Windows.Forms.Form
...
[ComVisible(true)]
public interface IMapControlInteractable
Но теперь моя проблема. Интерфейс содержит несколько функций. Я хочу разделить интерфейсы для отдельных групп задач. Поэтому я хочу интерфейс, который содержит функции ведения журнала и интерфейс для функций DataAccess и так далее.
Так что это будет что-то вроде:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public partial class GeekBrowser : GeekBasePage, IDataAccess, ILogging
...
public class GeekBasePage : System.Windows.Forms.Form
...
[ComVisible(true)]
public interface IDataAccess
...
[ComVisible(true)]
public interface ILogging
Но когда я делаю это, функции второго интерфейса (ILogging) не доступны из Javascript. Если я переключаю порядок интерфейсов, функции IDataAccess недоступны.
Таким образом, похоже, что в Javascript доступны только методы из первого интерфейса.
Что я могу сделать, чтобы сделать каждую функцию каждого интерфейса доступной? Еще раз, создание BaseClass ComVisible и удаление атрибута ClassInterface будет работать, но это не вариант.
Заранее спасибо!!
1 ответ
При выполнении аналогичного проекта мы обнаружили, что JavaScript мог получить доступ только к интерфейсу по умолчанию для создания оболочки COM, в вашем случае он выбирает первый интерфейс ComVisible, который он находит в качестве интерфейса по умолчанию, поскольку вы явно не устанавливаете интерфейс по умолчанию приписывать. Проблема в том, что JavaScript не имеет аналога QueryInterface.
Чтобы получить доступ к другим интерфейсам, нам нужно создать собственную версию QueryInterface для JavaScript, либо предоставив явную функцию типа приведения в интерфейсе по умолчанию (не очень элегантно), либо имея отдельный объект, который может выполнить преобразование в правильный ComVisible тип интерфейса.
Надеюсь, это поможет!