在Windows 7上使用VB6注册Free Com

我有一些从VB6代码中使用的.NET代码。 我一直在XP机器上通过创建列出依赖.NET程序集的VB6.exe.manifest文件来开发它。

例如,假设我的2个.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,这里是VB6.EXE.manifest的样子(我使用的是version = 1.1.0.0,因为那是版本我在AssemblyInfo.cs中设置了.NET AssemblyVersion:

              

然后,与同一目录中的DLL一起,我有程序集和它们自己的清单文件。 这是一个示例“Some.Assembly.A.dll.manifest”:

        

我还在引用的DLL上运行tlbexp来创建TLB文件,这是我在VB6项目文件中引用的内容。

我想转移到Windows 7 64 BIT机器。 使用相同的方法,当我点击在WIN7机器上实例化.NET对象的VB6代码时,我得到了

“ActiveX组件无法创建对象。”

在XP上,它成功了。 如果我故意拼错VB6.EXE.manifest中的Dependent组件 – 在XP上我得到

“此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。”

在WIN7上,VB6只是加载。 它就像忽略了WIN7上的清单,所以我无法在WIN7上使用REG FREE方法加载我的.NET对象。 如果我regasm DLL,一切正常。
关于如何在WIN7(64位)上使用reg free com使VB6工作的任何想法?

您是否尝试过在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 compatibilitybilty mode”运行
  • 在dependencywalker中运行它(它有一个模拟程序加载的选项,并会记录错误)

祝好运!

前几天我正在进行混合调试并得到错误:”ActiveX组件无法创建对象。”我建议您按照本文调试混合Visual Basic 6.0 / Visual Basic .NET应用程序并确保一个简单的例子适用于您的Win7 PC(我认为它适用于regasm)。 然后使用REG FREE位,我研究了以下链接: VB6中的.NET对象而不使用regasm.exe? 这里是基于.NET的组件的免注册激活:演练

您可能尝试在x64操作系统上使用tlbexp / win32选项。

来自这篇博文

您可以使用SxsTrace来帮助调试问题。 要开始跟踪运行“SxsTrace Trace -logfile:SxsTrace.etl”将日志文件转换为可以查看的内容,请运行“SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt”。

你试过吗?

另一件事是在Vista / Windows 7上你可以很容易地遇到UAC吗?

我已经能够使用Side by Side Manifest Maker创建的清单成功地在Win 7-64中使用VB6中的.Net类。 它有一个免费试用版。

不要忘记包含类所针对的.Net运行时版本。 这可能是你的问题,因为Win 7只预装了.Net 4客户端配置文件。

Regasm不仅仅生成TLB或需要的注册表项。

例如,它可以基于COM可见类型生成COM可见接口。 如果COM可见类型没有实现接口,Regasm将执行此操作。

您是否有任何COM可见类型没有实现接口(或者没有使用ComDefaultInterfaceAttribute定义COM接口)?

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