Windows Vista:无法加载 DLL“x.dll”:对内存位置的访问无效。 (DllNotFoundException)

Posted

技术标签:

【中文标题】Windows Vista:无法加载 DLL“x.dll”:对内存位置的访问无效。 (DllNotFoundException)【英文标题】:Windows Vista: Unable to load DLL 'x.dll': Invalid access to memory location. (DllNotFoundException) 【发布时间】:2010-09-06 22:55:56 【问题描述】:

我今天下午在一个装有 Windows Vista 的客户的盒子上进行测试(他有家,但我在 Business Edition 上进行测试,结果相同)。

我们使用 .DLL 获取计算机的硬件 ID。它的用法非常简单,我创建的示例程序可以工作。 Dll 是This from AzSdk。 事实上,这在 Windows XP 下完美运行。然而,出于某种奇怪的原因,在我们的项目中(更大),我们得到了这个异常:

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

我不知道是什么导致了问题,因为我可以完全控制文件夹。该项目是一个 c#.net Windows 窗体应用程序,一切正常,除了对外部库的调用。

我是这样声明的:(注意:它不是 COM 库,不需要注册)。

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool Bios, string sRegistrationCode);

然后调用代码就很简单了:

private void button1_Click(object sender, EventArgs e)

    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");

当您创建示例应用程序时,它可以工作,但在我的项目中却没有。 XP下工作正常。关于我应该在 Vista 中做什么来完成这项工作的任何想法? 正如我所说,该文件夹及其子文件夹对“所有人”具有完全控制权。

更新:我没有安装 Vista SP 1。

更新 2: 我已经安装了 Vista SP1,现在,在禁用 UAC 的情况下,即使是简单的示例也无法正常工作!!! :( 该死的 Vista。

【问题讨论】:

【参考方案1】:

无法加载 DLL“HardwareID.dll”: 对内存位置的无效访问。 (HRESULT 异常:0x800703E6)

DllNotFoundException 的名称让你感到困惑——这不是查找或加载 DLL 文件的问题,问题是当加载 DLL 时,它会进行非法内存访问,从而导致加载过程失败。

就像这里的另一张海报一样,我认为这是一个 DEP 问题,并且您的 UAC 等更改最终允许您为此应用程序禁用 DEP。

【讨论】:

+1 以这样一种方式解释问题,我可以理解真正的问题是什么,并且知道要开始寻找什么【参考方案2】:

@Martín

您没有收到 UAC 提示的原因是因为 UAC 只能更改进程的启动方式,一旦进程运行,它必须保持相同的提升级别。 UAC 将提示将在以下情况下发生:

Vista 认为它是一个安装程序(lots of rules here,最简单的是如果它被称为“setup.exe”), 如果它被标记为“以管理员身份运行”(您可以通过更改快捷方式或 exe 的属性来编辑它),或者 如果 exe 包含请求管理员权限的清单。

前两个选项是 UAC 之前存在的“旧版”应用程序的解决方法,新应用程序的正确方法是 embed a manifest resource 询问您需要的权限。

某些程序,例如Process Explorer 似乎提升了正在运行的进程(在这种情况下,当您在文件菜单中选择“显示所有进程的详细信息”时)但他们真正做的是启动一个新实例,就是这样提升的新实例 - 不是最初运行的实例。如果只有应用程序的某些部分需要提升(例如特殊的“管理选项”对话框),这是推荐的方法。

【讨论】:

【参考方案3】:

你有代码的机器是在 64 位机器上部署的吗?您也可能遇到DEP 问题。

编辑

这是配备第一代 Core Duo 2 英特尔处理器的第一代 Macbook Pro。远非 64 位。

我提到了 64 位,因为从 32 位到 64 位的低级别结构没有得到正确处理。由于这些机器不是 64 位的,那么禁用 DEP 很可能是一个很好的合乎逻辑的下一步。 Vista 确实比 XP SP2 更安全。

好吧,我刚刚在全球范围内关闭了 DEP,但无济于事。同样的错误。

好吧,我还读到有人在将机器更新到 Vista SP1 后遇到此错误。这些 Vista 安装是否有 SP1?

原来是完全不同的东西。只是为了测试,我禁用了 de UAC(注意:我没有收到任何提示)。

太好了,我实际上是打算这样做的,但我想你可能已经尝试过了。

【讨论】:

【参考方案4】:

您是否向供应商提出了支持请求?也许 MacBook Pro 的硬件有问题导致产品无法工作。

【讨论】:

【参考方案5】:

鉴于异常是 DllNotFoundException,您可能希望在安装 Vista 安装上的任何开发工具之前尝试使用 Dependency Walker 检查 HardwareID.dll,以查看是否确实缺少依赖项。

【讨论】:

异常名称可能具有误导性。见上面的帖子。【参考方案6】:

除了允许“所有人”完全控制之外,该位置是否还允许具有中等完整性级别的进程写入?

我该如何检查?我是Vista的新手,我不太喜欢它,它在VM中对于日常工作和VStudio在虚拟机中的使用来说太慢了,它没有带来任何新东西。

从命令提示符可以执行:

icacls C:\Folder

如果您看到诸如“Mandatory Label\High Mandatory Level”之类的行,则该文件夹只能由高完整性进程访问。如果没有这样的行,那么中等完整性进程可以访问它,前提是没有其他 ACL 拒绝访问(例如基于用户)。

编辑:忘了提到您可以使用 /setintegritylevel 开关来实际更改访问对象所需的完整性级别。

【讨论】:

以上是关于Windows Vista:无法加载 DLL“x.dll”:对内存位置的访问无效。 (DllNotFoundException)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Joomla 模板无法在 Windows 7 / Vista 的 IE9 中正确加载?

Windows 7/64 上的 NUnit“丢失”GPSVC.DLL

无法在 Vista x64 的 C# 应用程序中加载 C++ DLL

开机运行软件,出现kernel32.dll错误?求解决方案

在 Vista 客户端上安装后的 SQL Compact 问题

windows 无法启动加载内核所需的DLL文件