我有一些来自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接口)?

如果是这样,这可能是您的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top