使用.NET互操作编译VB6应用程序,只在我的机器上编译时运行

时间:2009-07-21 14:58:04

标签: c# .net com vb6 interop

我最近在.NET(Visual Studio 2008,项目目标是.NET 2.0)中开发了一个用于VB6应用程序的互操作用户控件。该程序集公开了1个控件,1个类,以及一些枚举和结构。我使用Interop Forms Toolkit 2.0项目模板found here的C#翻译开发了它。程序集具有强名称,并安装在GAC中,并使用以下脚本在regasm中注册:

@"C:\gacutil.exe" /i "C:\Program Files\AppName\Control.dll" /f
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe" "C:\Program Files\AppName\Control.dll" /tlb:"C:\Program Files\AppName\Control.tlb"

问题:当我在我的机器上编译VB6应用程序时,它将在任何其他机器上运行(当然,安装了控件)。但是,当应用程序在不同的计算机上编译时,它将在该计算机上运行,​​但不会在任何其他计算机上运行。当我说它没有运行时,我的意思是你试图运行它并且绝对没有任何反应。

我使用OleView检查我的机器和其他机器上的控件,并且所有GUID在类型信息中都是相同的。唯一的区别是一个有行importlib(“stdole2.tlb”)而另一个有importlib(“STDOLE2.TLB”)。

我的机器有:Visual Studio 6.0 sp6,VB6互操作用户控件模板,Windows SDK 6.0和6.0A,Visual Studio 2008 sp1。这台机器是有效的。

Coworkers machine:Visual Studio 6.0 sp6,Visual Studio 2005

另一台机器:Visual Studio 6.0 sp6,Visual Studio 2008. 2008今天早上安装了这个并没有解决问题。

如何让这些其他机器正确编译VB6应用程序,以便它在编译它的机器上运行?

(在评论中提出更多信息请求,我将对其进行编辑以提供答案。)

编辑:

有人提出了有关注册控制权限的建议。我想澄清控制似乎运作良好。我以完全相同的方式在工作的机器和不工作的机器上注册它。当引用控件的VB6应用程序在我自己的机器上编译时,问题就会出现。

我还应该补充一点,我有一个小的VB6主机应用程序,有1个表单和互操作控件和几个按钮。这个问题与主VB6应用程序没有相同的问题。

可能是线索

如果有人熟悉使用OleView.exe,我想我可能已经发现了一个线索。当我查看类型库列表时,有“OrderControl(Ver 0.1)”以及“OrderControlCtl(Ver 0.1)”。第一个使用为程序集定义的GUID,路径显示使用RegAsm.exe生成的OrderControl.tlb。第二个在不同的机器上有不同的GUID,我的路径是“C:\ Program Files \ Microsoft Visual Studio \ VB98 \ vbc00305.oca”,另一台机器上的路径是“C:\ Program Files \ Microsoft Visual Studio \ VB98 \ mscoree.oca“,并且在同事的机器上是”C:\ windows \ system32 \ mscoree.oca“。两个mscoree.oca的大小都相同,但我机器上的vbc00305.oca要小几KB。

我再次看了VB6项目的参考资料。引用列出OrderControl和OrderControlCtl,但仅检查OrderControlCtl。 OrderControl的位置是TLB文件,但OrderControlCtl的位置是每个站点上不同的OCA文件。

依赖步行者

我在DW中运行配置文件,用于在我的机器上编译的exe版本和在我们的构建机器上编译的版本(不会在我的机器上运行)。他们在以下两条线上分歧。两者都有第一行,但是运行的那一行继续进行更多的调用/加载,而没有立即运行的那一行开始在第一行之后分离:

GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32RedirectTypeLibrary") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E746129.
GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32MapConfiguredClsidToReferenceClsid") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E745C0D.

3 个答案:

答案 0 :(得分:2)

我已经发现它与我控制中的3个特定方法有关,这些方法是“返回”(通过ref参数)结构。我最终使用了一个涉及返回类而不是结构的解决方法。但我仍然很好奇,所以我问different question

答案 1 :(得分:0)

尝试从主VB6应用中的表单中删除用户控件并重新添加。

答案 2 :(得分:0)

不确定,但我也有类似的问题。尝试使用regasm with / codebase。