【问题标题】:extend a vb6 interface from c# without references从 c# 扩展一个 vb6 接口而不引用
【发布时间】:2015-08-20 05:29:14
【问题描述】:

我有一个名为 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 DLL,创建并使用 tlb 这样就没有循环引用

标签: c# interface vb6 extends


【解决方案1】:

VB6 不支持接口,CLSFW_SBSession 实际上是一个类名。它仍然会自动生成一个接口,这是使 COM 工作所必需的。它与类同名,但带有下划线前缀。另一个令人讨厌的小细节是 .NET 不支持多重继承。这需要您重新实现基本接口方法。 .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; }
}

重要的是,在 sn-p 中标记为猜测的声明与 _CLSFW_SBSession 接口的成员完全匹配。 VB6 很难找到,你必须在命令提示符下运行 OleView.exe 并使用 File + View Typelib 来查看类型库。

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

Fwiw,你应该强烈避免这样做,应该清楚这是相当脆弱的。不清楚为什么要这样做,请考虑利用 COM 的能力让 coclass 实现多个接口。唯一的问题是 VB6 和脚本语言仅支持默认界面,因此您的 .NET 类将无法从此类应用程序中轻松使用。请考虑封装,您可以添加一个返回 _CLSFW_SBSession 的工厂方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多