【问题标题】:.NET Windows 7 specific errors.NET Windows 7 特定错误
【发布时间】:2011-04-25 11:57:33
【问题描述】:

我有一个 .NET 应用程序和一个安装程序。使用 VS 2005 构建。

开发机器是Windows XP SP3。

一旦有人在 Windows7 下安装它。并得到以下错误

WinForm 线程异常

System.AccessViolationException:试图读或写保护 记忆。这通常是一个迹象 其他内存已损坏。 System.Windows.Forms.UnsafeNativeMethods.IOleObject.DoVerb(Int32 iVerb、IntPtr lpmsg、IOleClientSite pActiveSite,Int32 索引,IntPtr hwndParent,COMRECT lprcPosRect) System.Windows.Forms.AxHost.DoVerb(Int32 动词) System.Windows.Forms.AxHost.InPlaceActivate()

另一个

类型异常 'System.Windows.Forms.AxHost+InvalidActiveXStateException' 被抛出。方法“断开”不能 此时被调用。

现在,想知道问题出在哪里,并在这个Windows7上安装了VS 2005。 现在,该解决方案可以毫无例外地编译和运行。我构建了设置,并在这台 Win7 机器上重新安装了新构建的设置...

我得到了例外。为什么会这样?

使用VS启动的应用程序没有异常,但是在启动已安装的可执行文件后抛出它......

但是,我成功(无一例外地)在一些装有操作系统的机器上测试了已安装的应用程序 > Win XP:Windows 7 (x64) 和 Windows Server 2008 (x64) ...

研究日志,我发现了产生异常的代码:

Panel p = new Panel();
p.Margin = new Padding(0);
p.Dock = DockStyle.Fill;
p.Controls.Add(display); // 'display' is an ActiveX control instance

Logger.LogMessage("before");

this.tableLayoutPanel.Controls.Add(p); // protected memory EXCEPTION

Logger.LogMessage("after");

所以,我看到“之前”然后AccessViolationException: Attempted to read or write protected memory... 没有看到“之后”...

此类异常的常见原因是什么?

详情

  • 我在应用程序中使用了一些第三方 ActiveX;
  • 使用 ActiveX 的示例(用 C++ 编写)在这台机器上运行良好。
  • 该解决方案针对 x86 平台;
  • 我成功地在 **Windows Server 2008 (x64) 和 Windows 7 (x64) 上启动了该应用程序;
  • 尝试使用“Windows XP 兼容性(SP2、SP3)”模式 - 结果相同(例外)。
  • 试图将应用程序安装在ProgramFiles 的其他文件夹中。我使用 C:\TestFolder 作为安装路径 - 结果是一样的:AccesViolationException....

【问题讨论】:

  • 您的 .NET 应用程序中有任何 Win32API 代码吗?
  • 你在使用 ActiveX 控件吗?
  • 在“Windows XP”模式下运行会发生什么?
  • @leppie:那是一个虚拟机。保证可以正常工作。
  • @leppie,您的意思是 XP 兼容模式,而不是 XP 模式。听起来相似,但不是一回事。

标签: .net visual-studio visual-studio-2010 windows-7 .net-2.0


【解决方案1】:

哇,一个 x84 CPU,从未见过其中之一 ;-)) 你的意思可能是x64...

您的 Windows XP 安装是 64 位的?
这可能是 32/64 位转换问题,而不是 Windows 7 问题。

Forms.UnsafeNativeMethods.IOleObject

您是否激活了您的 ActiveX dll ?

它是 32 位 dll 还是 64 位 dll ? 32 位 dll 不能在 64 位环境中运行,反之亦然。

如果你通过 COM 调用它,你可能会有机会。 但至少在 Linux 上,C/C++ 数据类型 long 在 64 位模式下有 8 个字节,而在 32 位模式下有 4 个字节。

尝试在 .NET 应用程序中定位 x86 平台(=32 位)。

【讨论】:

  • 也许你没有仔细阅读,但解决方案确实针对 x84平台;
  • x84 平台不存在,所以不能定位它。 x86-x64(或简称 x64)平台确实存在,但为 x64 编译的任何东西都不会在 32 位 80x86 系统上运行。但你是对的,我没有仔细阅读。我首先以为您想在 64 位进程中运行 32 位 dll。而您确实正在尝试在 32 位机器或进程上运行 64 位进程(或 dll)……这当然行不通,而且它肯定不是 Windows7 错误。好吧,错误在于它不检查可执行文件/dll 的“位”。 PEBKAC。
  • @Serhio:然后 8086 变成了 80386,然后是 80486,然后是 80586,然后是 80686,等等。这就是为什么它写成 80x86,指的是 80386 向后兼容的最低标准.然后有人懒得在它前面写80,变成x86,然后有人懒得在x64前面写x86。显然,有些人不喜欢它,所以他们创建 x84 来指代 80x86-x64。
  • @Quandary:不是 84,而是 86...我的拼写不好...所以,它已经针对 x86...这就是我的意思。
  • @serhio: 好吧,现在说得通了。但是 ActiveX dll 是 64 位 dll,我接受它吗?因为否则它不应该在 64 位进程中工作?这可以解释为什么当您在 32 位机器上加载/调用它时它会失败,除非您已将其替换为 32 位等价物。
【解决方案2】:

听起来您使用的 ActiveX 控件与 Windows 7 存在兼容性问题。

【讨论】:

  • 然后,当您以在程序中的方式与它交互时,就会出现兼容性问题。
  • 示例应用程序是用 C++ 编写的......所以你可能有理由......但是,我在其他 Windows 7 下测试了我的应用程序...... x64 位......就像一个魅力。
【解决方案3】:

您很可能使用的是没有数据执行保护的旧版 XP。这在 Vista 和 7 中默认启用,并且会导致异常。

您很可能正在写入随机指针或已释放的内存。换句话说,你有错误。仅仅因为它在 XP 上运行良好并不意味着它没有任何问题。

【讨论】:

  • 在 .Net 中不太可能。
  • 我使用安装了最新更新的 XP 2002 SP3。我在 .NET 2 下没有“指针”...
  • 但是您的 ActiveX 控件可以。
  • 我有一个使用 AcX 的 C++ 示例,我在该机器上启动了该示例。
【解决方案4】:

将程序附加到本机调试器并检查堆栈跟踪。

您可能在该计算机上的全局挂钩或扩展遇到问题,会干扰您的 COM 组件。

【讨论】:

  • 什么意思...“将程序附加到本机调试器”我看到了这篇msdn.microsoft.com/en-us/library/k70yt3e2%28VS.80%29.aspx 文章,但是信息太多...不明白从哪里开始
  • @serhio:运行 Visual Studio 并将其调试器附加到您的程序中,一定要选择本机调试。
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多