使用 ComVisible 导出到 COM 时是否可以隐藏类父级?

发布于 2024-11-28 00:43:27 字数 704 浏览 0 评论 0原文

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无妨# 2024-12-05 00:43:27

声明一个接口,以便您可以显式命名对 COM 客户端可见的成员。像这样:

using System;
using System.Runtime.InteropServices;

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IThingsIWantToExpose {
    void mumble();
    // etc..
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class MyComClass : SomeBaseClass, IThingsIWantToExpose {
    // Actual implementation of the methods
    public void mumble() { }
    // etc, plus everything else that you want to do in the class
    //...
}

使用 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 System;
using System.Runtime.InteropServices;

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IThingsIWantToExpose {
    void mumble();
    // etc..
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class MyComClass : SomeBaseClass, IThingsIWantToExpose {
    // Actual implementation of the methods
    public void mumble() { }
    // etc, plus everything else that you want to do in the class
    //...
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文