我希望能够编写一个可以在C#和VB6类中实现的类接口,以便可以在VB6代码中以相同的方式处理这些类,但我无法完成这项工作.
在VB6中,我希望使用Implements关键字实现类VB6Class来实现某些接口ISharedInterface.
在C#中,我希望有一些其他的类C#Class,可以在实现ISharedInterface的同时向COM公开.
目的是使VB6代码将能够通过ISharedInterface在VB6Class和C#Class上进行操作,而无需关心类所使用的语言.
我想将此技术用作通过依次重写VB6端的所有内容来从VB6迁移的方法,如果我可以在C#中实现VB6中已有的接口,那将是理想的.但是失败了,即使我不得不重写C#接口以共享回VB6,这仍然会有用(即,我什至不在乎该接口是用C#编写,暴露给COM还是用COM编写并由C#,只要语言障碍的两侧都可以引用相同的接口).
我发现这异常困难.我可以引用来自COM的C#接口,但不能将其作为COM可见接口导出回COM.如果作为替代方案,我尝试在C#本身中创建一个接口,但我没有找到直接在COM上查看该接口的方法,而是尝试间接使用它的各种解决方法,例如创建一个存根类来实现该接口并公开当我尝试实现公开的存根类(即使它们已编译)时,作为COM可见,这只会在VB6中引发运行时错误.
我目前对此没有很好的解决方案,只有一个非常笨拙的工作,即在C#和VB6中实现单独的接口,将C#方法直接公开给COM,并在VB6中创建一个包装器类,该包装器仅将接口方法重定向到底层true方法.
创建单个接口(在VB6或C#中)并且两种语言都可以引用而无需我重复接口定义的最佳方法是什么?
解决方法:
What is the best way to create a single interface (either in VB6 or C#) which both languages can reference without me having to duplicate the interface definition?
用IDL编写接口,然后编译为在VB中引用并导入(tlbimp)到.NET的类型lib. (如果要使用它来定义接口,则需要避免VB6会执行的IID的再生.)
您可以在.NET中定义接口,但这将涉及更多步骤.