从c#扩展vb6接口,不需要引用

本文关键字:不需要 引用 接口 vb6 扩展 | 更新日期: 2023-09-27 17:53:27

我有一个名为CLSFW_SBSession的vb6接口

Public Property Let CommandLine(ByVal RHS As String)
End Property
Public Property Get ProcessToken() As String
End Property

我有一个c#接口,需要扩展vb6接口。

 [ComVisible(true)]
    [Guid("8d7c2025-221d-400f-b81c-2f78d65c5842")]
    public interface IClsSbSession : CLSFW_SBSession
    {
        string ProcessToken2 { get; }
        string CommandLine2 { get; set; }
    }

我不能从c#中引用ddl . com接口,因为dll . c#引用了dll . com。

是否可以动态完成?

从c#扩展vb6接口,不需要引用

VB6不支持接口,CLSFW_SBSession实际上是一个协类名。它仍然自动生成一个接口,这是使COM工作所必需的。它具有与类相同的名称,但带有下划线前缀。另一个讨厌的小细节是。net不支持多重继承。这需要您重新实现基接口方法。. COM互操作的一个相当大的缺陷是,您还必须重新声明基接口方法。所以它应该是:

[ComVisible(true)]
[Guid("8d7c2025-221d-400f-b81c-2f78d65c5842")]
public interface IClsSbSession : _CLSFW_SBSession
{
    // These are guesses:
    string CommandLine { get; set}
    string ProcessToken { get; }
    // End of guessing
    string ProcessToken2 { get; }
    string CommandLine2 { get; set; }
}

至关重要的是,代码片段中标记为猜测的声明必须与_CLSFW_SBSession接口的成员完全匹配。VB6使这很难发现,你必须从命令提示符运行OleView.exe,并使用File + View Typelib来查看类型库。

向VB6生成的类型库添加引用不是问题。必要时使用Tlbimp.exe。

有时候,你应该极力避免这样做,应该清楚这是非常脆弱的。不清楚为什么要这样做,但请考虑利用COM的能力,让一个协类实现多个接口。唯一的问题是VB6和脚本语言只支持默认接口,所以你的。net类在这样的应用程序中不容易使用。考虑封装,你可以添加一个返回_CLSFW_SBSession的工厂方法。