gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:13:12 25 4
gpt4 key购买 nike

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

由于某些未知原因,当类接口(interface)自动导出时(也称为属性 ClassInterface(ClassInterfaceType.AutoDispatch)),无法在 Delphi 中创建此类。我制作了一个简单的 C++ 程序来对此进行测试,但每次都出现相同的错误:0x80131509(无法通过 IDispatch 调用方法参数或返回类型)。经过一番挖掘,问题与 SoapHeader 直接相关。当我删除它或将它用作我的类的属性时,一切都运行良好。

在 C++ 中,当使用 IDispatch 访问我用 ClassInterfaceType.None 导出的类时,一切正常。但是我无法在 Delphi 中依赖 IDispatch,所以我正在寻找一种方法来避免类型库导出器导出 SoapHeader 内容。

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

最佳答案

声明一个接口(interface),以便您可以显式命名对 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 允许早期和晚期绑定(bind) (IDispatch)。 ClassInterfaceType.None 隐藏类成员,因此基类也不会暴露。顺便说一句,包括 System.Object 成员。

关于c# - 使用 ComVisible 导出到 COM 时是否可以隐藏父类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957961/

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