c# - C++ DLL 无法在某些机器上加载

标签 c# c++ dll

我正在尝试找出我的 DLL 在某些机器上加载失败的原因。

我的申请:

使用 setup.msi 安装程序部署的 C# 程序。安装程序内部是放置在应用程序安装目录中的 DLL。例如:

OUTDIR = c:\Program Files\MyApplicationName\%OUTDIR%\MyApplication.exe
dir %OUTDIR%\DLL_FOLDER\\*.dll 

myDLL.dll

C# 应用程序调用由以下内容指定的 LoadLibrary:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);   

基本上是这样

intPtr dll_handle = LoadLibrary("myDll.dll");

被调用,我们使用 dll_handle 来调用所需的函数。

到目前为止,这已经在我部署它的 5/7 的机器上工作了……我在这里犯了哪些明显的错误? :-)

感谢任何帮助!

最佳答案

最可能的解释是:

  1. 找不到 DLL。由于您没有指定完整路径,因此您依赖 Dynamic-Link Library Search Order找到它。将 DLL 放在与可执行文件相同的目录中是确保您可以找到它并找到正确版本的常用方法。
  2. DLL 的位数不匹配。例如,您有一个 64 位进程和一个 32 位 DLL,反之亦然。
  3. 已找到 DLL,并且具有正确的位数,但无法解析 DLL 的依赖项。通常这意味着需要在目标计算机上安装适当的 MSVC 运行时。

要采取的第一个诊断步骤是检查 LoadLibrary 的返回值,如果返回值是 NULL,则调用 GetLastError 来检索错误代码。在 p/invoke 中你这样做:

IntPtr lib = LoadLibrary(...);
if (lib == IntPtr.Zero)
    throw new Win32Exception();

您可以使用 Dependency Walker 等工具进一步调试问题。

关于c# - C++ DLL 无法在某些机器上加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26441038/

相关文章:

c - libsnd 文件 Windows 8

c# - 将 char * 参数传递给 C# 函数

c# - 打印 100 比 1?如何?

C++ 为什么不提供整数的系统最大大小?

c++ - LibGD 库不工作 : crash when saving image

c++ - 如何正确封装 std::set ?

exception - C++/CLI 应用程序在发布版本中随机崩溃

c# - 格式异常 : Could not find any recognizable digits

c# - 基于 bool 值的线程阻塞

C# 正则表达式忽略转义字符