我在c#.Net 4.5中编写了一个COM控件,这个COM控件使用第三方dll与USB设备进行通信。
在Windows 7 32bit上,一切都是从VBScript和VB6应用程序100%工作。在Windows 7 64位上,VBScript在调用使用USB设备的第三方DLL函数时失败。
例外情况是:“System.AccessViolationException”,带有消息:“试图读取或写入受保护的内存。这通常表示其他内存已损坏。”
我不明白的是,同样的COM控件(和相同的USB驱动程序)在从VB6应用程序实例化时有效,但不能从VBScript实现。
在运行VB6应用程序和VBScript时,我已经查看了使用Process Monitor加载的程序集和注册表访问,但我看不到任何异常。
有关我可以排除故障或接下来测试的建议吗?
答案 0 :(得分:0)
这是交易。从VB6编写的应用程序是32位的。您的应用程序适用于32位Windows和Windows 64上的VB6应用程序(由于VB6生成32位,因此运行为32位。因此,我们知道您的DLL适用于32位应用程序。
问题是,当您在Windows 64上运行VB脚本时,它将作为64位进程运行,并且您与32位DLL不匹配。如果使用32位版本的VB脚本引擎(c:\ windows \ syswow64 \ wscript.exe或c:\ windows \ syswow64 \ cscript.exe)运行VB脚本,它是否有效?它可能会。
现在,如果您使用AnyCPU处理器设置编译DLL,那么您仍然可以注册DLL并使其与64位进程一起使用。请务必使用64位配置单元中的regasm.exe。
例如注册你的DLL,
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /tlb /codebase c:\path\to\yourdll.dll