gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:24:19 26 4
gpt4 key购买 nike

我最近在 .NET(Visual Studio 2008,项目目标为 .NET 2.0)中开发了一个互操作用户控件,用于 VB6 应用程序。该程序集公开了 1 个控件、1 个类以及一些枚举和结构。我使用 Interop Forms Toolkit 2.0 的 C# 翻译开发了它项目模板 found here .该程序集具有强名称并安装在 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\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文件,每个站都不一样。

Dependency Walker

我在 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 参数)结构。我最终使用了涉及返回类而不是结构的解决方法。但是我还是很好奇,所以问了一个different question .

关于c# - 使用 .NET 互操作编译 VB6 应用程序,仅当在我的机器上编译时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com