.net Reg Free Com with VB6.exe on Windows 7

pgky5nke  于 2023-04-22  发布在  .NET
关注(0)|答案(8)|浏览(155)

我有一些从VB 6代码使用的.NET代码。我总是在XP机器上通过创建一个VB 6. exe. manifest文件来开发它,该文件列出了依赖的.NET程序集。
例如,假设我的2个.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,下面是VB6.EXE.manifest的样子(我在下面使用version=1.1.0.0,因为这是我在AssemblyInfo.cs中的.NET AssemblyVersion上设置的版本):

<?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.Assembly.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>

我还在引用的DLL上运行tlbexp来创建TLB文件,这是我在VB 6项目文件中引用的。
我想迁移到Windows 7 64位机器。使用相同的方法,当我在WIN7机器上执行示例化.NET对象的VB 6代码时,我得到
“ActiveX组件无法创建对象。”
如果我故意拼错VB6.EXE.manifest中的Dependent程序集-在XP上,我会得到
“由于应用程序配置不正确,此应用程序无法启动。重新安装应用程序可能会解决此问题。”
在WIN7上,VB 6只是加载。就像它忽略了WIN7上的清单,所以我不能在WIN7上使用REG FREE方法加载我的.NET对象。如果我regasm DLL,一切正常。
如何使VB 6在WIN7(64位)上与reg free com一起工作?

j8ag8udp

j8ag8udp1#

你有没有试过在WinXP兼容模式下简单地安装和运行VB6?

alen0pnh

alen0pnh2#

如果您正在为win7计算机重新编译vb6.exe或以其他方式对其进行处理,您应该知道一些较新的开发工具会自动嵌入清单,因此您可能需要检查它(一个快速的方法是在VS中打开可执行文件,并查找id为1的资源RT_MANIFEST)。如果有嵌入式清单,则忽略外部清单,这可能就是为什么当你编辑外部manfiest时,什么也没有发生,它的内容被忽略了。
除了欧诺说的sxstrace(你可以发布你从sxstrace得到的结果吗?),如果清单嵌入到其中,请确保更新VB6.exe的时间戳,否则VB6.exe.manifest. Vista + Win7缓存清单的内容,关闭根清单的时间戳,因此您的本地编辑可能不会被拾取。如果sxstrace给你空白结果,更新时间戳并重试。

s3fp2yjn

s3fp2yjn3#

首先想到的是,尝试对.net代码进行签名是值得的,这可能是因为在win7 64位上隐含地应用了一些更高级别的安全性,需要签名的程序集引用。
此外,你可以尝试缩小问题的范围(不分先后)

  • 将程序标记为以管理员身份运行,然后重试。
  • 标记程序以“xp/win 2k兼容模式”运行
  • dependencywalker中运行它(它有一个模拟程序加载的选项,并将记录错误)

祝你好运!

6fe3ivhb

6fe3ivhb4#

前几天我在做这个混合调试,得到了错误:“ActiveX组件无法创建对象。”我建议您遵循这篇文章Debugging Hybrid Visual Basic 6.0/Visual Basic .NET Applications,并确保一个基本的例子在您的Win7 PC上工作(我意识到它与regasm一起工作)。然后使用REG FREE位,我研究了以下链接:.NET Object from VB6 without use of regasm.exe?,这里是Registration-Free Activation of .NET-Based Components: A Walkthrough

brc7rcf0

brc7rcf05#

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

gev0vcfq

gev0vcfq6#

this blog post
你可以使用SxsTrace来帮助调试这个问题。2要启动跟踪,请运行“SxsTraceTrace-logfile:SxsTrace.etl”将日志文件转换为你可以查看的文件,请运行“SxsTraceParse-logfile:SxsTrace. etl-outfile:SxsTrace.txt”。
你试过吗
另一件事是,在Vista/Windows 7上,你可以很容易地运行到UAC,你检查了吗?

wwwo4jvm

wwwo4jvm7#

我已经能够成功地使用.Net类从vb 6在Win 7-64使用清单创建的Side by Side Manifest Maker。它有一个免费试用。
不要忘记包含你的类所针对的.Net运行时版本。这可能是你的问题,因为Win 7只预装了.Net 4 Client Profile。

cczfrluj

cczfrluj8#

Regasm不仅仅是生成TLB或所需的注册表项。
例如,它可以基于COM可见类型生成COM可见接口。当COM可见类型没有实现接口时,Regasm将执行此操作。
是否有任何COM可见类型不实现接口(或不使用ComDefaultInterfaceAttribute定义COM接口)?
如果是这样,这可能是你的问题。

相关问题