C# .NET/VB6应用程序在Windows 7上失败
我有一个.NET 3.5 winforms应用程序,它调用VB6 ActiveX DLL中的一个方法,从而打开一个对话框。在将近10年的时间里,一切都运转良好,首先是作为.NET1.1应用程序,然后是2.0,然后是3.5,都是在WindowsXP上运行的。现在客户已升级到Windows 7,我遇到System.AccessViolationException:尝试读取或写入受保护的内存。这通常表示其他内存已损坏 调用的结构如下所示: .NET代码 VB6Object类中的VB6代码 问题从这一行的VB6代码开始:调用frmPopup.ShowvbModal。错误会传播到.NET代码。VB6代码中的错误处理程序在我处理错误的地方被完全忽略。我原以为问题可能是frmPopup的加载事件,但代码从未到达加载事件我到处都有跟踪语句,所以我就是这样知道的 有趣的是,我第二次打电话时,它根本没有失败,但表单缺少第三方网格ActiveX-DevXPress Quantum网格,因此我假设网格可能与Windows 7不兼容 我所描述的一切都是在我以EXE或VS2008 IDE的形式运行应用程序时发生的,因此VB6 ActiveX DLL只是一个参考。如果我使用COM间接寻址并在IDE中运行VB6代码,那么一切都可以正常工作 我试着以管理员的身份运行,但没有任何改变C# .NET/VB6应用程序在Windows 7上失败,c#,visual-studio-2008,vb6,windows-7,access-violation,C#,Visual Studio 2008,Vb6,Windows 7,Access Violation,我有一个.NET 3.5 winforms应用程序,它调用VB6 ActiveX DLL中的一个方法,从而打开一个对话框。在将近10年的时间里,一切都运转良好,首先是作为.NET1.1应用程序,然后是2.0,然后是3.5,都是在WindowsXP上运行的。现在客户已升级到Windows 7,我遇到System.AccessViolationException:尝试读取或写入受保护的内存。这通常表示其他内存已损坏 调用的结构如下所示: .NET代码 VB6Object类中的VB6代码 问题从这一行
下一步我可以去哪里解决此问题?确保您是针对x86目标而不是任何CPU进行编译,尤其是在64位系统上运行时。在64位Windows 7系统上,如果将anyCPU与旧的32位DLL一起使用,则会出现某种冲突,引用旧的IBM手册,结果是不可预测的。请确保编译的是x86目标而不是anyCPU,尤其是在64位系统上运行时。在64位Windows 7系统上,如果将anyCPU与旧的32位DLL一起使用,则会出现某种冲突,引用旧的IBM手册,结果是不可预测的。关闭DEP。旧的Ax控件倾向于使用时髦的子类化thunk,而不是ATL/MFC控件,因为没有人愿意关闭NX标志。关闭DEP。旧的Ax控件倾向于使用时髦的子类化thunk,而不是ATL/MFC控件,没有人愿意关闭NX标志。您是否尝试过与旧版本的Windows兼容运行?右键单击可执行文件并转到兼容性选项卡;“有时候这就像魔术一样奏效。”比默盖伊,是的。我忘了提到这一点-是的,我尝试过兼容模式-它不起作用。如果你在VB应用程序中运行VB6代码,你能重现失败吗?如果是这样,您可能可以使用VB调试器更精确地跟踪它。@如果我在VB IDE中运行ActiveX DLL(如我提到的使用COM间接寻址),一切都会正常工作。您是否尝试与旧版本的Windows兼容运行?右键单击可执行文件并转到兼容性选项卡;“有时候这就像魔术一样奏效。”比默盖伊,是的。我忘了提到这一点-是的,我尝试过兼容模式-它不起作用。如果你在VB应用程序中运行VB6代码,你能重现失败吗?如果是这样,您可能可以使用VB调试器更精确地跟踪它。@Dan如果我在VB IDE中运行ActiveX DLL(如我提到的使用COM间接寻址),一切都会正常工作。结果是可以预测的。64位Windows系统上的任何CPU都会创建一个64位进程,然后将不会加载32位DLL。32位DLL的使用期限根本不重要。在这种情况下,Win7是32位的,所以这不是问题所在。结果是可以预测的。64位Windows系统上的任何CPU都会创建一个64位进程,然后将不会加载32位DLL。32位DLL的使用年限根本不重要。在本例中,Win7是32位的,所以这不是问题所在。该死,你叫它。现在怎么办?有没有一个简单的方法来解决这个问题,或者我要用另一个10年前的网格替换一个10年前的网格?该死,你叫它。现在怎么办?有没有一个简单的方法来解决这个问题,或者我要用另一个10年的网格替换一个10年的网格?
try {
VB6Object obj = new VB6Object();
obj.DoStuff();
}
catch (Exception ex) { // handle }
Public Sub DoStuff()
on error goto errHandle
RetrieveData();
Call frmPopup.Show(vbModal)
exitPoint:
exit sub
errHandle:
' handle error
End Sub