【问题标题】:C# 2010 is not loading delphi DLLC# 2010 未加载 delphi DLL
【发布时间】:2014-08-28 13:18:03
【问题描述】:

我遇到了一个问题。我在 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");
        }
    }
}

}

【问题讨论】:

  • 确保您的 C# 应用程序在 x86 模式下运行。
  • 请检查如何通过使用GetLastError 使这些函数报告错误。在这里,您可能只需将其添加到您的 if 语句中:throw new Win32Exception(); 看看会发生什么。
  • 你读过LoadLibrary的文档吗?它描述了如何处理错误。
  • @DavidHeffernan 难道不是因为 user2724058 正在调用 LoadLibrary() API,但使用了 LoadLibraryEx() 参数占用空间吗? (我从来没有做过这样的事情,所以我不确定。)
  • 我多次将 VC++ DLL 加载到 .NET 中,并且一直有效。但我遇到了 delphi win32 DLL 的问题

标签: c# .net delphi pinvoke


【解决方案1】:

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 的依赖关系未解决。

【讨论】:

  • 跟我想的一模一样!
【解决方案2】:

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

提示:您是否检查过您的应用程序是在 32 位还是 64 位中运行,适合 DLL?

不过,我可以告诉你如何获得有关该问题的更多信息。

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

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

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

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

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

【讨论】:

  • C# 应用程序是使用 x86 设置编译的,Delphi DLL 在 32 位的 delphi 2009 中。我的操作系统是 Windows 7 64 位。我只是加载库而不加载任何 DLL 过程。通过调试现在它给了我 LoadLibrary 函数执行的以下错误。调用 PInvoke 函数“LoadLibrary”使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配
  • 该消息是运行时检测到我的回答中描述的错误。
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2012-07-28
相关资源
最近更新 更多