我有一些从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一起工作?
8条答案
按热度按时间j8ag8udp1#
你有没有试过在WinXP兼容模式下简单地安装和运行VB6?
alen0pnh2#
如果您正在为win7计算机重新编译vb6.exe或以其他方式对其进行处理,您应该知道一些较新的开发工具会自动嵌入清单,因此您可能需要检查它(一个快速的方法是在VS中打开可执行文件,并查找id为1的资源RT_MANIFEST)。如果有嵌入式清单,则忽略外部清单,这可能就是为什么当你编辑外部manfiest时,什么也没有发生,它的内容被忽略了。
除了欧诺说的sxstrace(你可以发布你从sxstrace得到的结果吗?),如果清单嵌入到其中,请确保更新VB6.exe的时间戳,否则VB6.exe.manifest. Vista + Win7缓存清单的内容,关闭根清单的时间戳,因此您的本地编辑可能不会被拾取。如果sxstrace给你空白结果,更新时间戳并重试。
s3fp2yjn3#
首先想到的是,尝试对.net代码进行签名是值得的,这可能是因为在win7 64位上隐含地应用了一些更高级别的安全性,需要签名的程序集引用。
此外,你可以尝试缩小问题的范围(不分先后)
祝你好运!
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
brc7rcf05#
您可以尝试在x64操作系统上使用
tlbexp
的**/win32**选项。gev0vcfq6#
从this blog post
你可以使用SxsTrace来帮助调试这个问题。2要启动跟踪,请运行“SxsTraceTrace-logfile:SxsTrace.etl”将日志文件转换为你可以查看的文件,请运行“SxsTraceParse-logfile:SxsTrace. etl-outfile:SxsTrace.txt”。
你试过吗
另一件事是,在Vista/Windows 7上,你可以很容易地运行到UAC,你检查了吗?
wwwo4jvm7#
我已经能够成功地使用.Net类从vb 6在Win 7-64使用清单创建的Side by Side Manifest Maker。它有一个免费试用。
不要忘记包含你的类所针对的.Net运行时版本。这可能是你的问题,因为Win 7只预装了.Net 4 Client Profile。
cczfrluj8#
Regasm不仅仅是生成TLB或所需的注册表项。
例如,它可以基于COM可见类型生成COM可见接口。当COM可见类型没有实现接口时,Regasm将执行此操作。
是否有任何COM可见类型不实现接口(或不使用ComDefaultInterfaceAttribute定义COM接口)?
如果是这样,这可能是你的问题。