某些机器上无法加载C ++ DLL

时间:2014-10-18 14:50:07

标签: 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 个答案:

答案 0 :(得分:7)

最可能的解释是:

  1. 找不到DLL。由于您未指定完整路径,因此您可以依靠Dynamic-Link Library Search Order来定位它。将DLL放在与可执行文件相同的目录中是通常的方法,以确保您可以找到它,并找到正确的版本。
  2. DLL具有不匹配的位数。例如,您有64位进程和32位DLL,反之亦然。
  3. 找到了DLL,并且具有正确的位数,但无法解析DLL的依赖性。通常这意味着需要在目标计算机上安装适当的MSVC运行时。
  4. 要采取的第一个诊断步骤是检查LoadLibrary的返回值,如果是NULL,则调用GetLastError以检索错误代码。在p / invoke中你这样做:

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

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