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

时间:2008-08-27 01:03:23

标签: c# .net windows-vista dllnotfoundexception

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

我们使用获取计算机硬件ID的.DLL。它的用法很简单,我创建的示例程序也很有效。 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*");
}

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

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

更新2:我已经安装了Vista SP1,现在,在禁用UAC的情况下,甚至没有简单的示例工作! :(该死的Vista。

6 个答案:

答案 0 :(得分:4)

  

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

DllNotFoundException的名称令您感到困惑 - 这不是查找或加载DLL文件的问题,问题是当加载DLL时,它会执行非法内存访问,导致加载过程失败。 / p>

就像这里的另一张海报一样,我认为这是一个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)似乎会提升正在运行的进程(在这种情况下,当您选择“显示所有进程的详细信息”时),但他们真正做的是启动一个新实例,这是新的实例升级 - 而不是最初运行的实例。如果只有应用程序的某些部分需要提升(例如特殊的“管理选项”对话框),这是推荐的方法。

答案 2 :(得分:1)

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

修改

  

这是第一代Macbook Pro,配备第一代Core Duo 2 Intel处理器。远离64位。

我提到了64位,因为在32位到64位的低级别结构中没有得到妥善处理。由于机器不是64位,因此很可能禁用DEP将是一个很好的逻辑下一步。 Vista确实比XP SP2更安全。

  

好吧,我刚刚将DEP全局转为无效。同样的错误。

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

  

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

很好,我实际上会建议,但我想你可能已经尝试过了。

答案 3 :(得分:0)

您是否向供应商提出了支持请求?也许有一些关于MacBook Pro硬件的东西阻止了产品的运行。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

  
    

除了允许对“Everyone”进行完全控制外,该位置还允许具有中等完整性级别的进程写入吗?

  
     

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

从命令提示符到您可以执行:

icacls C:\Folder

如果您看到诸如“强制标签\高强制等级”之类的行,则该文件夹只能用于高完整性过程。如果没有这样的线路,则介质完整性进程可以访问它,前提是没有其他ACL拒绝访问(例如,基于用户)。

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