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

从c#扩展vb6接口,无需引用,c#,interface,vb6,extends,C#,Interface,Vb6,Extends,我有一个vb6接口,名为CLSFWSBU会话 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

我有一个vb6接口,名为CLSFWSBU会话

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


可以动态执行吗?

VB6不支持接口,CLSFW_SBSession实际上是一个coclass名称。它仍然自动生成一个接口,这是使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; }
}
片段中标记为猜测的声明必须与_CLSFW_SBSession接口的成员完全匹配,这一点至关重要。VB6使这一点很难找到,您必须在命令提示符下运行OleView.exe,并使用File+View Typelib查看类型库

添加对VB6生成的类型库的引用不会是问题。如有必要,请使用Tlbimp.exe

Fwiw,你应该强烈避免这样做,应该清楚这是相当脆弱的。目前还不清楚为什么要这样做,请考虑利用COM的能力来实现一个Co类实现多个接口。唯一的问题是VB6和脚本语言只支持默认接口,因此您的.NET类在此类应用程序中不易使用。考虑封装,你可以添加一个工厂方法,返回一个工厂,它不使用VB6DLL,创建和使用一个TLB,这样就没有循环引用。