关于c#:Windows Vista:无法加载DLL \\’x.dll \\’:对内存位置的无效访问。 (DllNotFoundException)

关于c#:Windows Vista:无法加载DLL \\’x.dll \\’:对内存位置的无效访问。 (DllNotFoundException)

Windows Vista: Unable to load DLL 'x.dll': Invalid access to memory location. (DllNotFoundException)

我今天下午在装有Windows Vista的客户package盒上进行测试(他有家,但我在具有相同结果的商业版上进行测试)。

我们使用.dll获取计算机的硬件ID。它的用法非常简单,我创建的示例程序也可以正常工作。 Dll是来自AzSdk的。
实际上,这在Windows XP下非常有效。但是,由于某些奇怪的原因,在我们的项目中(越来越大),我们得到了以下异常:

1
2
3
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库,不需要注册)。

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

然后调用代码非常简单:

1
2
3
4
5
6
7
8
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。


Unable to load DLL 'HardwareID.dll':
Invalid access to memory location.
(Exception from HRESULT: 0x800703E6)

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

就像这里的另一个发布者一样,我认为这是一个DEP问题,并且您的UAC等更改最终使您可以为此应用程序禁用DEP。


@Mart?-n

之所以没有得到UAC提示,是因为UAC只能更改流程的启动方式,一旦流程运行,它就必须保持在同一海拔高度。如果出现以下情况,UAC将提示发生:

  • Vista认为它是安装程序(此处有很多规则,最简单的规则是将其称为" setup.exe"),
  • 如果将其标记为"以管理员身份运行"(您可以通过更改快捷方式或exe的属性进行编辑),或者
  • 如果exe包含要求管理员权限的清单。

前两个选项是针对UAC之前的"旧版"应用程序的解决方法,对新应用程序执行此操作的正确方法是嵌入清单资源,以询问所需的特权。

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


您的计算机上是否已将代码部署在64位计算机上?您可能还会遇到DEP问题。

编辑

This is a 1st gen Macbook Pro with a 1st gen Core Duo 2 Intel processor. Far from 64 bits.

我提到了64位,因为在较低级别上,无法正确处理从32位到64位的结构。由于计算机不是64位的,因此下一步很可能是禁用DEP。 Vista确实比XP SP2更安全。

Well, I've just turned DEP globally off to no avail. Same error.

好吧,我还读到人们在将计算机更新为Vista SP1之后遇到此错误。这些安装的Vista是否带有SP1?

Turns out to be something completely different. Just for the sake of testing, I've disabled de UAC (note: I was not getting any prompt).

太好了,我实际上是想提出这个建议,但我认为您可能已经尝试过了。


In addition to allowing full control to"Everyone" does the location also allow processes with a medium integrity level to write?

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

从命令提示符处可以执行:

1
icacls C:\\Folder

如果看到诸如" Mandatory Label \\\\ High Mandatory Level"之类的行,则该文件夹仅可用于高度完整性过程。如果没有这样的线路,则只要没有其他ACL拒绝访问(例如,基于用户),介质完整性进程就可以访问它。

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


鉴于该异常是DllNotFoundException,因此您可能要尝试在Vista安装程序上安装任何开发工具之前,先使用Dependency Walker检查HardwareID.dll,以查看实际上是否缺少依赖项。


您是否已向供应商提出支持请求? MacBook Pro硬件可能有某些问题,导致该产品无法正常工作。


推荐阅读