使用 ComVisible 导出到 COM 时是否可以隐藏类父级?
在 C# 类库 (.Net 3.5) 中,我有一个非常简单的类(一些字符串和长属性,没有方法),它继承自 System.Web.Services.Protocols.SoapHeader。我的类被标记为 ComVisible(true) 因为我需要在 Delphi 中使用它。
由于某些未知的原因,当自动导出类接口(又名属性 ClassInterface(ClassInterfaceType.AutoDispatch))时,无法在 Delphi 中创建此类。 我编写了一个简单的 C++ 程序来测试这一点,但每次都会出现相同的错误:0x80131509(无法通过 IDispatch 调用方法参数或返回类型)。 经过一番挖掘,问题与 SoapHeader 直接相关。当我删除它或将它用作我的班级的财产时,一切都运行良好。
在 C++ 中,当使用 IDispatch 访问使用 ClassInterfaceType.None 导出的类时,一切正常。 但我无法在 Delphi 中中继 IDispatch,因此我正在寻找一种方法来避免类型库导出器导出 SoapHeader 内容。
有办法做到这一点吗?通知类型库导出器避免暴露类父类的 .Net 属性?即使有更多的东西,也只暴露类的一部分?
In a C# class library (.Net 3.5), I have a very simple class (some string and long properties, no methods) which inherit from System.Web.Services.Protocols.SoapHeader. My class is tagged as ComVisible(true) because I need to use it in Delphi.
For some unknown reason, this class can't be created in Delphi, when the class interface is automatically exported (aka attribute ClassInterface(ClassInterfaceType.AutoDispatch)).
I made a simple C++ program to test about that, and I get each time the same error: 0x80131509 (Methods parameters or return type cannot be invoked via IDispatch).
After some digging, the problem is directly related to SoapHeader. When I remove it or use it as property of my class, all run fine.
In C++, when using IDispatch to access my class exported with ClassInterfaceType.None, all work fine.
But I can't relay on IDispatch in Delphi, so I'm searching a way to avoid the type library exporter to export SoapHeader stuff.
Is there a way to do that ? A .Net attribute to inform the type library exporter to avoid exposing a class parent ? To expose only a part of a class even if there is more stuff ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
声明一个接口,以便您可以显式命名对 COM 客户端可见的成员。像这样:
使用 ComInterfaceType.InterfaceIsDual 允许早期和晚期绑定 (IDispatch)。 ClassInterfaceType.None 隐藏类成员,因此基类也不会公开。顺便说一句,包括 System.Object 成员。
Declare an interface so you can explicitly name the members that are visible to COM clients. Like this:
Using ComInterfaceType.InterfaceIsDual allows both early and late binding (IDispatch). ClassInterfaceType.None hides the class members so the base class isn't exposed either. Including the System.Object members btw.