C# Windows Vista:无法加载DLL';x、 dll';:对内存位置的访问无效。(DllNotFoundException)

C# Windows Vista:无法加载DLL';x、 dll';:对内存位置的访问无效。(DllNotFoundException),c#,.net,windows-vista,dllnotfoundexception,C#,.net,Windows Vista,Dllnotfoundexception,今天下午,我在一个客户的盒子上测试了Windows Vista(他有家,但我在一个商业版上测试了相同的结果) 我们使用一个.DLL来获取计算机的硬件ID。它的使用非常简单,我创建的示例程序也很有效。Dll是。 事实上,这在Windows XP下非常有效。然而,出于某种奇怪的原因,在我们的项目中(更大),我们得到了以下例外: Exception Type: System.DllNotFoundException Exception Message: Unable to loa

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

我们使用一个.DLL来获取计算机的硬件ID。它的使用非常简单,我创建的示例程序也很有效。Dll是。 事实上,这在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库,不需要注册)

调用代码非常简单:

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*");
}
当您创建一个示例应用程序时,它可以工作,但在我的Projectt中却不行。在XP下工作正常。关于我应该在Vista中做些什么来实现这一点,有什么想法吗? 正如我所说,文件夹及其子文件夹对“所有人”具有完全控制权

更新:我没有安装Vista SP 1


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

是您在64位计算机上部署代码的机器吗?您也可能遇到问题

编辑

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

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

嗯,我刚刚关闭了DEP,但没有用。同样的错误

嗯,我还读到,人们在将机器更新到Vista SP1后出现了这个错误。这些Vista安装中有SP1吗

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


太好了,我本来打算建议您这样做,但我想您可能已经尝试过了。

您是否向供应商提出了支持请求?可能是MacBook Pro硬件的某些方面阻止了产品的工作。

如果异常是DllNotFoundException,您可能需要尝试检查硬件ID.d在Vista上安装任何开发工具之前,请先安装,以查看是否缺少依赖项

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

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

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

@

您没有收到UAC提示的原因是,UAC只能更改流程启动的方式,一旦流程运行,它必须保持在相同的标高。如果:

  • Vista认为它是一个安装程序(,最简单的一个是如果它被称为“setup.exe”)
  • 如果它被标记为“以管理员身份运行”(您可以通过更改快捷方式或exe的属性来编辑它),或者
  • 如果exe包含请求管理员权限的清单
前两个选项是针对UAC之前的“遗留”应用程序的变通方法,针对新应用程序的正确方法是请求您所需的特权

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

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

我怎么检查呢?我是Vista新手,我不太喜欢它,它在虚拟机中的日常工作和虚拟机中的VStudio使用速度都太慢,它没有带来任何新东西

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

icacls C:\Folder
如果看到“强制标签\高强制级别”这样的行,则只有高完整性进程才能访问该文件夹。如果没有这样的行,则中等完整性进程可以访问该文件夹,前提是没有其他拒绝访问的ACL(例如,基于用户)


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

+1以这样的方式解释问题,我可以理解真正的问题是什么,并且知道如何开始查找异常的名称可能是误读。请参阅上面的帖子。
icacls C:\Folder