【问题标题】:Unable to load Win32 Native DLL file from C#.NET无法从 C#.NET 加载 Win32 Native DLL 文件
【发布时间】:2011-01-11 07:44:46
【问题描述】:

我有一个 C# winapp。我从 C# 应用程序中调用了一个本地 .dll 文件(我自己用 C++ 创建),它工作正常。

但是当我将我的应用程序(.exe 和 .dll 文件)复制到另一台机器时,我收到一条错误消息:

无法加载 DLL“c:\dllname.dll”:找不到指定的模块。 (HRESULT 异常:0x8007007E)

这是 C# 代码:

class IsoMessageHelper
{
    public const string ISO8583_DLL = "c:\\Hc8583.dll";
    [DllImport(ISO8583_DLL, CallingConvention = CallingConvention.Cdecl)]
    public static extern bool InitializationRq(...)
}

我该怎么办?

【问题讨论】:

  • 请在您的 C# 代码中发布您的 <DllImport> 声明。
  • 我编辑了帖子,也写了 C# dll 导入代码。
  • 我注意到您的代码仍然硬编码 C:\ 目录中 DLL 的路径。正如其他答案所暗示的那样,没有理由这样做。应用程序将自动加载与可执行文件位于同一目录中的 DLL。您只需要文件名。
  • 问题不在于路径和文件名。它是 .dll 依赖项。我的 dll 使用 MSVCR100.dll 中的一些函数,默认情况下这些函数不在 windows\system32 文件夹中。我复制了缺失的 dll,它工作正常。
  • 是的,chibacity 已经将其作为您的问题(顺便说一句,您应该接受他的回答——单击左侧空白处的空心复选标记)。我只是补充一点,在应用程序的源代码中硬编码 DLL 的路径并不是一种好的做法。它们的最佳位置是您的应用程序的目录,如果您省略路径规范,它将首先检查那里。很高兴看到您解决了问题。

标签: c# winapi dll


【解决方案1】:

部署具有本机依赖项的 .Net 应用程序时的一个常见问题是,本机 dll 本身可能在目标计算机上缺少依赖项,例如正确版本的 C 运行时。

使用Dependency Walker 之类的工具来分析您的本机 dll 并确定它是否对您复制它的机器缺少依赖项。

【讨论】:

  • @user434186 请注意,您应该对有帮助的答案进行投票,并接受可以解决您的疑问和问题的答案。
  • 找不到文件指向此作为答案。 @user434186 请按照@chibacity 所说的去做,投票选出好的答案,并接受之前问题的最佳答案。
  • 它是 .dll 依赖项。我的 dll 使用 MSVCR100.dll 中的一些函数,默认情况下这些函数不在 windows\system32 文件夹中。我复制了缺少的 dll,它工作正常。谢谢。
  • @user434186 太好了——现在你应该投票赞成我的回答并接受它! :)
【解决方案2】:

尽量不要对指定文件名的DllImport 属性参数中的任何路径进行硬编码。然后你应该使用该文件在可执行文件之外。

类似这样的:

[DllImport("user32.dll", CharSet = CharSet.Unicode)]

【讨论】:

  • 我复制了 C# .exe 文件旁边的 .dll。甚至复制到'C:\\'路径并解决它,但问题存在!
【解决方案3】:

将 DLL 移至根目录。如果可行,请查看您的属性以确定原因。你还没有发布任何代码,所以我不能给你任何具体的原因。

【讨论】:

  • 我复制了 C# .exe 文件旁边的 .dll。甚至复制到'C:\\'路径并解决它,但问题存在!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2016-09-17
相关资源
最近更新 更多