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

C# 使用ComVisible导出到COM时是否可以隐藏类父级?,c#,delphi,com,C#,Delphi,Com,在C#类库(.NET3.5)中,我有一个非常简单的类(一些字符串和长属性,没有方法),它继承自。我的类被标记为ComVisible(true),因为我需要在Delphi中使用它 由于某些未知的原因,在自动导出类接口(又称属性ClassInterface(ClassInterfaceType.AutoDispatch))时,无法在Delphi中创建此类。 我做了一个简单的C++程序来测试这个,并且每次都得到同样的错误:0x80131509(方法参数或返回类型不能通过IDISPoT调用)。 经过一些

在C#类库(.NET3.5)中,我有一个非常简单的类(一些字符串和长属性,没有方法),它继承自。我的类被标记为ComVisible(true),因为我需要在Delphi中使用它

由于某些未知的原因,在自动导出类接口(又称属性ClassInterface(ClassInterfaceType.AutoDispatch))时,无法在Delphi中创建此类。 我做了一个简单的C++程序来测试这个,并且每次都得到同样的错误:0x80131509(方法参数或返回类型不能通过IDISPoT调用)。 经过一些挖掘,问题直接与SoapHeader有关。当我删除它或将其用作类的属性时,所有这些都可以正常运行

在C++中,当使用IDISPoT访问类IsPrimeType导出的类时,没有,所有的工作都很好。 但是我不能在Delphi中依赖IDispatch,所以我正在寻找一种方法来避免类型库导出器导出SoapHeader内容


有办法吗?一个.Net属性,通知类型库导出器避免暴露类父级?即使有更多内容,也只公开类的一部分?

声明一个接口,以便可以显式命名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成员。

这是个好主意,但Delphi7无法“看到”界面。因此,它运行在C++中,但在delphi中不好。德尔福应该没有任何问题。我不知道Delphi,一定要用Regasm/codebase/tlb创建一个类型库并导入.tlbIt,这正是我们几分钟前尝试的,Delphi7没有看到它。你知道,德尔福7是相当老(2002年),这是一个真正的痛苦,但。。。legacy是legacy:)我编辑这个问题以消除关于接口的模糊性。最后一句话不是很清楚,Delphi7可以很好地使用和公开COM对象。您的COM对象是64位的吗?Delphi是32位的。再问一个问题,这与这个问题没有任何关系。你到底打算通过接口公开什么?本机COM接口(非IDispatch)可能需要一个非空的vtable,并且在它上没有任何方法。那么,您是否尝试添加名为
getProperty1'和
getProperty2'的方法,而不是依靠属性神奇地工作,而不为get属性方法添加任何vtable条目?