【问题标题】:Calling an x86 dll from a VS 2010/DotNet 4.0 x86 targeted app从 VS 2010/DotNet 4.0 x86 目标应用程序调用 x86 dll
【发布时间】:2011-08-09 22:25:04
【问题描述】:

在 x64 平台 (Windows 7) 上运行时调用 x86 dll 中的方法时,我收到“AccessViolationException”“试图读取或写入受保护的内存”。一切都在 x86 平台上运行良好。

我已经阅读了很多很多关于类似问题的帖子,但我的代码无法正常工作。

我正在努力让我们的旧 x86 应用程序在 Windows 7 (x64) 和 Server 2008 R2 (x64) 上正常运行。该应用程序包含 VB6、VB.Net、C#、MicroFocus COBOL 和 C++。 (我们当时想不出任何其他语言可以加入)。 DotNet 代码最初是在 Visual Studio 2003 中为 DotNet 1.1 编写的。我已将代码移植到 Visual Studio 2010 和 DotNet 4.0。我已将所有项目的目标设置为 x86。当我调用非托管 32 位 dll 时,出现上述错误。

我们的 InstallShield 安装例程将 x86 dll 安装到 C:\Windows\sysWOW64 而不是 C:\Windows\System32。这种行为似乎是正确的。 dll 是一些 COBOL 目标代码和运行时组件,它们链接在一起形成一个“C 风格”的 dll。我不认为问题与 COBOL 或链接过程有关,因为我还从 Code Project 中移植了一个示例应用程序,其中包含一个调用简单 C++ dll 的 VB.Net WinForms 应用程序,所有这些应用程序都针对 x86。我在那里得到同样的错误。我还尝试构建一个 C++ 命令行应用程序来调用 dll。加载库成功。 GetProcAddress 成功。调用特定方法的函数指针失败。在 Windows 7 x64 上运行时,我们的 VB6 应用程序可以很好地调用 dll。我还尝试关闭 UAC 并将清单中的 requestedExecutionLevel 设置为最高可用。我试过以管理员身份运行。

似乎这应该可行,但不确定接下来要尝试什么。有什么想法吗?

【问题讨论】:

    标签: dll x86 64-bit access-violation


    【解决方案1】:

    在 x64 .net 上,程序将作为 64 位程序运行,并且不能调用 32 位 dll。

    尝试使用目标 x86 而不是“任何目标”来编译应用程序。你也可以强制 使用 .Net CorFlags.exe 实用程序构建的 .exe 的目标,以在 32 位模式下运行。

    当然你的程序会在 32 位环境下运行,尤其是它最多只有 2gb 的 RAM。

    【讨论】:

    • OP 说,“...将所有项目的目标设置为 x86”。
    • 感谢您回复我。是的,我已经这样做了——所有项目都设置为以 x86 为目标,并且存在访问冲突错误。还有其他建议吗?
    【解决方案2】:

    好消息,

    我们调查了 DEP 作为问题的可能原因,因为我们发现即使我们的 VB6 代码在 DEP 开启时也会失败。我们注意到,当 DEP 打开时,VB.Net 代码的失败方式与 VB6 相同。显然,我们的 COBOL dll 做了 DEP 不满意的事情。不幸的是,DotNet 程序集似乎不尊重操作系统的 DEP 设置,因此您必须使用 editbin.exe 关闭 DEP:

    editbin.exe /nxnocompat:no

    我仍然需要在我们的完整应用程序上对其进行测试,但看起来我们有一个解决方案!

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2013-01-08
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多