【问题标题】:DELPHI XE2 DLL can't be added to C# application无法将 DELPHI XE2 DLL 添加到 C# 应用程序
【发布时间】:2012-04-10 12:15:46
【问题描述】:

为了测试,我试图在 C# 应用程序(在 Visual C# 2010 Express 中开发)中调用 Delphi XE2 DLL(参见代码)。

procedure CLP; stdcall; export;
begin
  showmessage('TEST');
end;

exports CLP;

但是,当尝试将 DLL 作为对 C# 项目的引用添加时,会出现以下消息:

无法添加对“D:\temp\test.dll”的引用。请确保 该文件是可访问的,并且这是一个有效的程序集或 COM 组件。

当在 Delphi 2010 下编译相同的 DLL 时,它可以正常工作。

感谢任何解决问题的建议。

【问题讨论】:

  • 你从来没有在这里接受过答案,也没有投票过。我恳请您阅读faq 并了解 Stack Overflow 的这些重要部分。

标签: c# delphi dll


【解决方案1】:

您不能将非托管 DLL 添加到 .NET 项目。

但是你可以导入函数,例如Platform Invoke Tutorial

【讨论】:

    【解决方案2】:

    您正在尝试链接到非托管的本机 DLL。您不能将这样的东西作为参考添加到托管应用程序中。

    调用你的DLL的方法是使用p/invoke:

    [DllImport(@"test.dll", CallingConvention=CallingConvention.Stdcall)]
    static extern void CLP();
    

    当您开始为 DLL 设置参数时,事情自然会变得有点复杂,但您可以通过 p/invoke 走很长一段路。

    您需要注意的一件事是,如果您的 DLL 是 32 位,您的托管项目以 x86 为目标,如果您的 DLL 是 64 位,您的托管项目以 x64 为目标。

    最后一点,注意在现代 Delphi 中使用 export 是没有意义的。您应该简单地删除它,因为编译器无论如何都会忽略它。

    【讨论】:

    • 感谢您的回答。 DLLImport 完成了这项工作。
    • 大卫,我相信你是对的,因为你通常是 :) 但请提供关于导出毫无意义的声明的参考。编译器如何知道哪些函数对导入可见?
    • @VilleKrumlinde exports 子句确定导出哪些函数
    • 谢谢大卫,我误读了你,我以为你的意思是“出口”声明毫无意义。我忘记了“导出”指令,也不再使用它。
    【解决方案3】:

    Henk 是对的,我想补充几点。

    首先,您只能添加一个 .NET 托管 dll(调用程序集)的 dll。但是您可以从非托管 dll 或 exe 文件中导入非托管函数。所以正确的问题是如何从非托管 dll 中导入函数,你应该寻找答案。而且我认为最好的起始位置是pinvoke网站。

    【讨论】:

      猜你喜欢
      • 2017-12-02
      • 2011-04-28
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多