我正在将VB6应用程序转换为C#.net并处理Shared Add Ins。单击MS Word中的按钮我想打开我的应用程序,为此我创建了这样一个类的对象。
objApp = Interaction.CreateObject("DocSys.Application");
但是这行代码总是返回旧的vb6应用程序实例,而我正在添加.net项目的refrance。 我该怎么做才能获得.net对象。
答案 0 :(得分:1)
有多种方法可以解决这个问题。忘记制作你的界面和类[ComVisible(true)]例如。或者忘记注册COM服务器,使用Regasm.exe / codebase / tlb明确地完成。或者使用错误版本的Regasm.exe,64位版本将写入错误的注册表项。
与CreateObject()更相关,C#类的[ProgId]属性对于确保为VB6服务器创建精确替代品至关重要。如果客户端代码曾经使用过早期绑定,那么接口和类的[Guid]属性必须与VB6服务器使用的guid匹配精确。当然,方法和属性必须完全匹配VB6服务器使用的方法和属性,顺序也非常重要。
将橙色与苹果进行比较的最佳方法是使用Oleview.exe实用程序。从Visual Studio命令提示符运行它并使用文件+视图Typelib。首先选择您的VB6服务器。复制/粘贴您在文本文件中看到的IDL并保存,这样您就不必重复这样做了。
在C#程序集上运行tlbexp.exe,为C#服务器创建类型库。再次运行Oleview.exe并选择该.tlb文件。现在,您可以将服务器的IDL与VB6服务器的IDL进行比较。确保你在guids,方法和属性上完全匹配。
最后但并非最不重要的是,如果客户端代码实际使用Interaction.CreateObject(),那么它是一个.NET应用程序。这意味着您根本不应创建[ComVisible] COM服务器。它应该是一个常规的.NET程序集,只需添加对它的引用并直接使用公共类。