【问题标题】:Using a Delphi native dll in C# (DllImport issue)在 C# 中使用 Delphi 本机 dll(DllImport 问题)
【发布时间】:2012-09-27 13:52:03
【问题描述】:

我在将 Delphi 本机 dll 导入 .net 时遇到问题。 我收到 System.EntryPointNotFoundException

这是我的 delphi dll:

procedure ProcedimientoEncriptar(texto,clave,resultado:PChar); export stdcall;
    var ...
    begin
    ....
    ....
    end;

    exports
      ProcedimientoEncriptar ;

这是我在 .Net (C#) 上的 DllImport 代码:

[DllImport("CryptoDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
        public static extern void ProcedimientoEncriptar([MarshalAs(UnmanagedType.LPStr)]string texto, [MarshalAs(UnmanagedType.LPStr)]string clave, [MarshalAs(UnmanagedType.LPStr)] StringBuilder resultado);

任何帮助将不胜感激, 迭戈。

【问题讨论】:

  • 我认为这不是您的实际代码。 Delphi function 意味着有一个返回值。但你的没有。并且您的 C# 代码有 void 返回。你的Delphi代码真的是function吗?不是procedure。您在问题中的 Delphi 代码无法编译。将代码放入问题时请使用复制/粘贴。不要发布虚假代码。
  • 你说得对,它是procedure,但我出于测试目的更改了它(我尝试返回PChar)。
  • 什么Delphi版本? PChar 是不是 Unicode?​​span>
  • 我不确定,我对 Delphi 还很陌生,但我正在使用 Embarcadero 的解决方案 (Borland Developer Studio 2006)...

标签: c# delphi pinvoke


【解决方案1】:

System.EntryPointNotFoundException 的唯一解释是 C# 代码找到的 DLL 不是您显示的 Delphi 代码生成的 DLL。因此,也许 C# 代码正在获取 DLL 的过时版本。或者它可能正在选择一个完全不同的 DLL。

例如,我的系统在 system32 目录中有一个名为 cryptdll.dll 的 DLL。这很可能是您的 C# 代码正在查找的 DLL。

为了确保找到正确的 DLL,您需要将 Delphi DLL 的副本放在与 C# 可执行文件相同的目录中。

【讨论】:

  • 谢谢,大卫,这就是问题所在。我不知道系统上存在“cryptdll.dll”。我将 dll 重命名并将其复制到 /bin/ 目录,它可以正常工作(它是一个 ASP .Net 应用程序)。干杯,迭戈。
  • @Diego Iturriaga:大卫是对的。在 Windows 中,D.L.L. 的位置。可能是一个问题,与 Delphi 生成无关,在这种情况下,同样的错误可能发生在 D.L.L.用其他语言编译,文件系统位置错误。
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多