在Windows 7上使用VB6的Reg Free COM
-
14-10-2019 - |
题
我有一些来自VB6代码的.NET代码。我一直在XP计算机上创建列出了依赖.NET组件的VB6.exe.manifest文件,从而在XP计算机上开发了这一点。
例如,假设我的2 .net组件是soming.sembly.a.dll和some.sembly.b.dll,这是vb6.exe.manifest的外观(我在下面使用version = 1.1.0.0,因为那是版本我在AssemblyInfo.cs中的.NET组装上设置:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type = "win32"
name = "client"
version = "1.1.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Some.Assembly.A"
version="1.1.0.0" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Some.Assembly.B"
version="1.1.0.0" />
</dependentAssembly>
</dependency>
</assembly>
然后,与同一目录中的dll一起,我有汇编及其自身的清单文件。这是一个示例“ some.sembly.a.dll.manifest”:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="Some.Assembly.A"
version="1.1.0.0" />
<clrClass
clsid="{F1234567-1234-1234-1234-123456789012}"
progid="Some.Assembly.A.Class1"
threadingModel="Both"
name="Some.Assembly.A.Class1" >
</clrClass>
<file name = "Some.Assembly.A.dll" />
</assembly>
我也跑了 tlbexp
在引用的DLL上以创建TLB文件,这就是我在VB6项目文件中引用的内容。
我想移至Windows 7 64位机器。使用相同的方法,当我点击vb6代码,以实例化Win7计算机上的.NET对象
“ ActiveX组件无法创建对象。”
在XP上,它成功了。如果我故意拼写vb6.exe.manifest中的依赖组件 - 在XP上,我得到
“由于应用程序配置不正确,因此该应用程序未能启动。重新安装应用程序可能会解决此问题。”
在Win7上,VB6只是加载。就像它忽略了Win7上的清单一样,因此我无法使用Win7上的Reg免费方法加载.NET对象。如果我 regasm
DLL,一切都起作用。
关于如何使VB6在Win7上与Reg Free Com一起使用的任何想法(64位)?
解决方案
您是否尝试过在WinXP兼容模式下简单地安装和运行VB6?
其他提示
如果您正在重新编译VB6.EXE或以其他方式为Win7机器进行处理,则应知道一些较新的开发工具自动嵌入了清单,因此您可能需要检查一下(快速方法是在VS中打开可执行文件,并查找具有ID 1的资源RT_Manifest。如果有嵌入式清单,则忽略了外部清单,这可能是为什么当您编辑外部人类最大的人时,什么也不会发生,其内容也被忽略了。
除了Erno对SXSTRACE所说的话(您可以发布从SXSTRACE获得的结果吗?),请确保更新vb6.exe的时间戳,如果清单已嵌入其中,或者vb6.exe.manifest否则。 Vista + Win7缓存清单的内容,从根清单的时间戳开始,因此您的本地编辑可能不会被拾取。如果SXSTRACE为您提供空白的结果,请更新时间戳,然后重试。
想到的第一件事是,值得尝试签署.NET代码。可能是隐含的一些更高级别的安全性应用于Win7 64位,需要签名的程序集参考。
此外,您可以尝试通过(没有特定顺序)来缩小问题
- 标记该程序以运行为管理员和重试。
- 标记以“ XP/WIN2K兼容模式”运行的程序
- 运行 依赖关系 (它具有模拟程序加载的选项,并将记录错误)
祝你好运!
前几天我正在进行此混合动力调试,并收到了错误:'activex组件无法创建对象。”我建议您遵循本文 调试混合Visual Basic 6.0/Visual Basic .NET应用程序 并确保一个裸露的骨头示例在您的Win7 PC上起作用(我会与Regasm一起使用)。然后,有了Reg免费位,我研究了以下链接: .NET对vb6的对象无需使用RegasM.exe吗? 和这里 基于.NET的组件的无注册激活:演练
您可能会尝试使用 /win32 选项 tlbexp
在X64 OS上。
从 这篇博客文章
您可以使用SXSTRACE来帮助调试问题。要开始跟踪运行“ SXSTRACE TRACE -LOGFILE:SXSTRACE.ETL”,以将日志文件转换为可以查看运行的“ SXSTRACE PARSE -LOGFILE:SXSTRACE.ETL -OUTFILE -OUTFILE:SXSTRACE.TXT”的内容。
你尝试过吗?
另一件事是,在Vista/Windows 7上,您可以轻松地遇到UAC,您检查了吗?
我已经能够使用由Win 7-64中的VB6成功使用.NET类。 并排清单制造商. 。它有免费试用。
不要忘记包括类目标的.NET运行时版本。从Win 7开始,这可能是您的问题,它附带了.NET 4客户端个人资料仅预装。
Regasm的作用不仅仅是生成TLB或需要注册表密钥。
例如,它可以基于COMIBLE类型生成COM可见接口。当Com可见类型未实现界面时,Remasm将执行此操作。
您是否有任何不实现接口的可见类型(或不使用ComdeFaultInterfaceAttribute定义com接口)?
如果是这样,这可能是您的问题。