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
是的,这还不够.最好的方法是使用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源文件中.之后,您可以删除装配参考.