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

我最近在.NET(Visual Studio 2008,项目目标是.NET 2.0)中开发了一个用于VB6应用程序的互操作用户控件。 该程序集公开了1个控件,1个类,以及一些枚举和结构。 我使用此处的Interop Forms Toolkit 2.0项目模板的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。 这台机器是有效的。

同事机: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 \ vcc00305.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个特定方法有关,它们是’返回’(通过ref参数)结构。 我最终使用了一个涉及返回类而不是结构的解决方法。 但我仍然很好奇,所以我问了一个不同的问题 。

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

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