【问题标题】:How to Create DLL in C# and call in Delphi XE6 [duplicate]如何在 C# 中创建 DLL 并在 Delphi XE6 中调用 [重复]
【发布时间】:2015-01-15 16:20:04
【问题描述】:

我在 VS2013 中使用 File/New Project/Class Library 创建了一个 DLL。然后我尝试在 Delphi 中动态加载它。但是 Delphi 返回NIL 用于过程GetProcAddress

我的 C# 和 Delphi 代码看起来像我在下面发布的。在代码GetProcAddress 中返回NIL。如果我遗漏了什么,请告知。

C# 代码

using System;
namespace TestDLL
{
    public class Class1
    {
        public static string EchoString(string eString)
        {
            return eString;
        }
    }
}

德尔福代码

 Type
    TEchoString = function (eString:string) : integer;stdcall;

  function TForm1.EchoString(eString:string):integer;
  begin
    dllHandle := LoadLibrary('TestDLL.dll') ;
    if dllHandle <> 0 then
    begin
      @EchoString := GetProcAddress(dllHandle, 'EchoString') ;
      if Assigned (EchoString) then
            EchoString(eString)  //call the function
      else
        result := 0;
      FreeLibrary(dllHandle) ;
    end
    else
    begin
      ShowMessage('dll not found ') ;
   end;
end;

【问题讨论】:

  • 我根据“非托管程序”的建议更改了代码。仍然没有运气。
  • 我不明白那个评论。我回滚了你的编辑。请不要改变问题。请务必添加更多内容以要求澄清,但不要进行使历史完全无效的更改。
  • 另外,如果你不发布假代码会更好。 C# 代码是假的。
  • 谢谢大卫。我会记住这一点。
  • public static string EchoString(string eString:string) 不是有效的 C#。而且它与 Delphi 代码不匹配。

标签: c# delphi


【解决方案1】:

C# DLL 是托管程序集,不会通过经典的 PE 导出来导出其功能。您的选择:

  1. 使用 C++/CLI 混合模式封装 C#。然后,您可以按常规方式在非托管模式下导出函数。
  2. 使用 Robert Giesecke 的 UnmanagedExports。这可能比 C++/CLI 包装器更方便。
  3. 将托管功能公开为 COM 对象。

一旦您选择了这些选项之一,您将不得不处理您滥用string 数据类型的问题。这是对互操作无效的私有 Delphi 数据类型。对于问题PWideChar 中的简单示例就足够了。

【讨论】:

  • 我刚刚将关闭标记为重复并链接到您之前的答案!在您回答的 cmets 中,它甚至提到了这个问题被问的频率:-) 不过,我仍然对您的回答投了赞成票!
  • 那么这些是我需要采取的额外步骤吗? 1.在 C# 中安装包 UnmanagedExports。在 C# 中的 EchoString 函数上方添加 [DllExport("EchoString")]。我做了上述步骤,仍然无法正常工作。还有什么我错过的吗??
  • 嗯,不是全部。这些是您的选择。 UnmanagedExports 是最简单的。
  • 所以在安装 Nuget 包后,我在 echostring 函数上方添加了这段代码 [DllExport("echostring", CallingConvention = CallingConvention.StdCall)]。仍然 delphi 没有找到该程序。我还缺少什么。谢谢。
  • 函数名不匹配。你必须让字母大小写正确。另外,至少暂时停止使用字符串。看看你是否可以用简单的整数获得成功。然后继续处理更复杂的数据。看我的更新。最后,使用external 而不是运行时链接。它使代码更简单。
猜你喜欢
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多