vb6到vb.net dll兼容版本

Ted*_*Ted 2 .net vb.net vb6 dll vb6-migration

我解释一下我的问题:

我在vb6中有一些程序(5-6),在vb6中有很多DLL.我们将在Vb.Net中执行这些DLL和程序的迁移.

我们想从DLL开始,每个程序引用2或3个DLL.

我想在vb.net中执行DLL的迁移(没问题)但是我想保持我的旧vb6 DLL和vb.net中的新版本之间的(二进制)兼容性因为没有它我将不得不重新使用此DLL构建每个应用程序,因为兼容性已被破坏.

我搜索了很多,我试图采取vb6类的GUID并强制它在VB.NET中使用类似的东西:

<Guid("B3F3EF24-F6E8-4XF9-A686-824DXXX2DF0")>
<ProgId("Project.ClsObj")>
 Public Class ClsObj
 ....
Run Code Online (Sandbox Code Playgroud)

并选择:使组件COM-Visible

但即便如此,如果我部署vb.net DLL(与vb6 DLL的名称相同)并使用regasm注册它:该程序不起作用.

如果你有一些想法,我会很感激我不知道我想做的事情是否真的可行

THKS

Han*_*ant 5

是的,这还不够.最好的方法是使用OleView.exe实用程序,从Visual Studio命令提示符运行它.使用File> View TypeLib并首先选择您的VB6 DLL.您将在右侧窗格中看到类型库的内容.将其复制/粘贴到文本编辑器中,这是您的.NET版本需要完全匹配的"主".再次使用File> View Typelib,这次选择.NET .tlb文件进行比较.

首先需要注意的是接口,这是VB6中完全不可见的细节.接口的[uuid]必须匹配,现在它不匹配.您可以保留现在的编程风格,而不是显式声明接口,但必须使用Microsoft.VisualBasic.ComClassAttribute.它可以让你指定的类[的Guid],你已经有了,但的[的Guid]接口.一个用于[默认]接口,另一个用于[source]接口(如果有).

下一个细节是类型库的uuid和版本号,也可以从[library]块顶部的OleView中看到.使用项目>属性>应用程序>装配信息按钮.复制guid并设置AssemblyVersion的前两个数字以匹配.


接下来,您需要仔细比较OleView的VB6和.NET输出,并验证接口成员的顺序和参数是否完全匹配.小错误导致很难诊断运行时故障.意外省略或交换两个成员会导致VB6调用完全错误的.NET方法.争论错误导致堆栈不平衡.

有一种更好的方法可以确保这不会出错,您实际上可以在VB.NET项目中使用VB6类型库中的接口声明.项目>添加新参考>浏览按钮/选项卡>选择VB6可执行文件.你的班级应该类似于:

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
<Guid("B3F3EF24-F6E8-4XF9-A686-824DXXX2DF0")> _
<ProgId("Project.ClsObj")> _
Public Class ClsObj
    Implements _ClsObj

    '' etc..
End Class
Run Code Online (Sandbox Code Playgroud)

_ClsObj您在OleView输出中找到的接口名称在哪里.这样做的一大优点是,您可以完全确定您的类可以从现有的VB6代码中安全地使用.当你逐步执行此操作时,这当然很重要,一次替换一个VB6可执行文件.

缺点是你保持对VB6类型库的依赖.务必将其检入源代码管理中.你最终可以使用像Reflector或ILSpy这样的反编译器来摆脱它.要求它反编译接口类型并将其复制/粘贴到VB.NET源文件中.之后,您可以删除装配参考.