【问题标题】:DllImport fails on windows XP SP3 but works on windows 7DllImport 在 Windows XP SP3 上失败,但在 Windows 7 上有效
【发布时间】:2014-02-06 19:33:00
【问题描述】:

我从这个站点创建了一个示例应用程序 http://www.codeproject.com/Articles/9826/How-to-create-a-DLL-library-in-C-and-then-use-it-w 它创建一个 C 代码并在 C# 应用程序中使用。

 #include <stdio.h>

 extern "C"
 {
  __declspec(dllexport) void DisplayHelloFromDLL()
   {
   printf("Hello from DLL !\n");
   }
 }

C# 代码:

using System;
using System.Runtime.InteropServices;     // DLL support

class HelloWorld
{
  [DllImport("TestLib.dll")]
  public static extern void DisplayHelloFromDLL ();

  static void Main ()
  {
    Console.WriteLine ("This is C# program");
    DisplayHelloFromDLL ();
  }
}

这在 Windows 7 上运行良好。我在 Windows 7 机器上的 Visual Studio 2010 上构建了代码。当我尝试在 Windows XP 上运行 exe 时,它​​失败并引发以下异常:无法加载 DLL 'TestLib.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

【问题讨论】:

  • XP机器上部署VS2010 C运行库了吗?
  • 命名执行环境通常是个好主意。但是,在这种情况下,这模糊了您的观点:这与“Windows 7 与 Windows XP”无关,而是与“开发机器与普通机器”有关。 @Frédéric 已经暗示了这一点。
  • @FrédéricHamidi 不,我没有在 win xp 上部署 Visual Studio 2010。
  • @IInspectable :只有这段代码不适用于 dllImport。但以下 dllImport 工作 msdn.microsoft.com/en-us/library/…>

标签: c# c windows winapi dll


【解决方案1】:

最可能的解释(概率接近 1)是 Windows 7 机器安装了 MSVC 运行时,但 XP 机器没有。

下载 VS2010 MSVC 运行时的可再发行组件并将其安装在 XP 机器上。然后您的代码应该可以工作。运行时已经在 Windows 7 机器上,因为那是您的开发机器。

FWIW,您的 p/invoke 不太正确。它未能指定调用约定。应该是:

[DllImport("TestLib.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void DisplayHelloFromDLL();

【讨论】:

  • 嗨。我添加了调用约定。仍然没有运气。给出同样的错误
  • 当然不是。这不是你的主要问题。你应该按照我说的安装运行时。
  • 我现在也安装了运行时。然而它无法加载dll。同样的错误。
  • 你到底安装了什么?您是否尝试过在 Profile 模式下运行 Dependency Walker 以查看故障发生的位置。 XP机器上安装了什么SP?
  • 嘿,它奏效了。感谢您对依赖步行者的建议。我发现它仍然抱怨缺少 msvcr100.dll。重新安装了可再发行组件。像魅力一样工作!
【解决方案2】:

在 Windows 7 上编译一个简单的 hello world 可执行控制台应用程序,并尝试在 Windows XP 上单独运行它。它应该比 DLL 更详细。它要么抱怨缺少某些 DLL,要么抱怨 32/64 位不匹配。

【讨论】:

  • 嗨。我尝试了一个简单的hello world exe,就像你说的那样。它在没有任何变化的情况下都可以正常工作。
猜你喜欢
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多