编译VB6应用程序瓦特/ .NET互操作,只运行,如果编译我的机器上(Compiling VB6 a

2019-07-30 13:09发布

我最近开发.NET互操作的用户控件(Visual Studio 2008中,项目靶向.NET 2.0),以在VB6应用程序中使用。 该组件暴露1所控制,1类,以及一些枚举和结构。 我开发它使用的C#转换的Interop表单工具包2.0项目模板这里找到 。 该组件具有很强的名称和被安装在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是在类型信息相同。 唯一的区别是一个有行导入库(“STDOLE2.TLB”)和其他有导入库(“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(版本0.1)”以及“OrderControlCtl(版本0.1)”。 第一种使用了该组件定义的GUID和路径显示了使用RegAsm.exe生成的OrderControl.tlb。 第二个有不同的GUID在不同的机器和矿山的路径为“C:\ Program Files文件\微软的Visual Studio \ VB98 \ vbc00305.oca”,在另一台机器上的路径为“C:\ Program Files文件\微软的Visual Studio \ VB98 \ mscoree.oca”,和同事的机器上是 “C:\ WINDOWS \ SYSTEM32 \ mscoree.oca”。 无论mscoree.oca的大小相同,但在我的机器上vbc00305.oca是几KB的。

我再次在VB6项目的引用看去。 引用列表都OrderControl和OrderControlCtl,但只有OrderControlCtl检查。 OrderControl的位置是TLB文件,但OrderControlCtl的位置是OCA文件的每个站不同。

的Dependency Walker

我跑型材在DW的版本,我的机器和一个我们的构建机器(不会对矿井运行)上编上编译的EXE的。 他们在发散以下2行。 两人都在第一线,但在运行一个继续与更多的呼叫/负载,而不会立即执行一个从这里开始的第一行后分离:

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.

Answer 1:

因为我已经发现,它与我的控制3个特定的方法是被“回”(通过做ref参数)结构。 我结束了使用涉及返回类的结构,而不是一个解决方法。 但我还是好奇,所以我问了一个不同的问题 。



Answer 2:

尝试在你的主VB6应用程序去除形式向用户控制,并重新添加。



Answer 3:

不知道,但我也发出这样。 尝试使用regasm与/代码库。



文章来源: Compiling VB6 app w/ .NET interop, only runs if compiled on my machine