我有一个名为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。
是否可以动态完成?
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的工厂方法。