我最近开发.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.