C#2010没有加载delphi DLL

时间:2014-08-28 13:18:04

标签: c# .net delphi pinvoke

我遇到了问题。我在delphi 2009中编写了win32 DLL。现在我想从C#桌面应用程序动态加载该DLL,但LoadLibray函数返回0.这是CSharp代码,请问任何正文可以帮助我为什么不加载DLL?

public partial class Form1 : Form
{
  [DllImport("kernel32.dll")]
  public static extern IntPtr LoadLibrary(string dllToLoad, IntPtr hFile, uint dwFlag);

  [DllImport("kernel32.dll")]
  public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

  [DllImport("Kernel32.dll")]
  private extern static Boolean CloseHandle(IntPtr handle);


  public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IntPtr ptr = IntPtr.Zero;
        ptr = LoadLibrary("MyDLL.dll", IntPtr.Zero, 0);

        if (ptr == IntPtr.Zero)
        {
            MessageBox.Show("DLL not laded");
        }
    }
}

}

2 个答案:

答案 0 :(得分:3)

LoadLibrary的签名错误。它应该是:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllname);

您有两个虚假参数,但没有捕获错误代码。

调用Win32函数时始终检查错误。在这种情况下

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

常见故障模式包括:

  • 不匹配的位数。
  • 在DLL搜索路径上找不到DLL。
  • DLL的依赖关系未解析。

答案 1 :(得分:1)

我无法告诉您为什么DLL没有加载,因为问题中没有足够的信息。

提示:您是否检查过您的应用程序是否以32位或64位运行适当的DLL?

然而,我可以告诉您如何获得有关该问题的更多信息。

首先,将以下内容添加到属性中:

[DllImport("Kernel32.dll", SetLastError=true)]
                         ^-----------------^

然后将此添加到处理问题的if语句中:

if (ptr == IntPtr.Zero)
    throw new Win32Exception();

这应该会为您提供更具体的异常消息,指出问题可能是什么。