gpt4 book ai didi

c# - 具有多个接口(interface)的 ObjectForScripting 不起作用

转载 作者:行者123 更新时间:2023-11-29 15:51:30 24 4
gpt4 key购买 nike

我有一个 WinForm,它通过 ObjectForScripting 与 WebBrowserControl 交互。我的 WinForm 的基类不是 ComVisible,我不能也不会更改它。因为有一个 NonComVisibleBaseClass,所以我创建了一个接口(interface)并将其设置为 ComVisible(true) 并设置了 FormAttribute [ClassInterface(ClassInterfaceType.None)]。接口(interface)中的方法可以被 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

但现在我的问题。该接口(interface)包含多个功能。我想为单独的任务分组分离接口(interface)。所以我想要一个包含日志功能的接口(interface)和一个用于数据访问功能的接口(interface)等等。

所以它会是这样的:

[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

但是当我这样做时,无法从 Javascript 访问第二个接口(interface) (ILogging) 的功能。如果我切换接口(interface)的顺序,则无法访问 IDataAccess 函数。

因此,在 Javascript 中似乎只能访问第一个接口(interface)中的方法。

如何使每个界面的每个功能都可访问?再次声明,使 BaseClass ComVisible 并删除 ClassInterface 属性将起作用,但不是一个选项。

提前致谢!

最佳答案

在做一个类似的项目时,我们发现 JavaScript 只能访问生成 COM 包装器的默认接口(interface),在您的情况下,它会选择它找到的第一个 ComVisible 接口(interface)作为默认接口(interface),因为您没有明确设置默认接口(interface)属性。问题是 JavaScript 没有类似的 QueryInterface。

要访问其他接口(interface),我们需要为 JavaScript 创建我们自己的 QueryInterface 版本,方法是在默认接口(interface)中提供显式转换类型函数(不太优雅),或者有一个单独的对象可以执行转换到正确的 ComVisible 接口(interface)类型。

希望对您有所帮助!

关于c# - 具有多个接口(interface)的 ObjectForScripting 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com