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 тип интерфейса.

Надеюсь, это поможет!

Другие вопросы по тегам