DELPHI XE2的DLL无法添加到C#应用程序中。

3

为了测试,我试图在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组件。

当相同的DLL在Delphi 2010下编译时,它可以正常工作而没有任何问题。

欢迎提供任何解决该问题的建议。


3
您在这里从未接受过答案或进行投票。我恭敬地请求您阅读[faq],以了解Stack Overflow的这些重要部分。 - David Heffernan
3个回答

6

您不能将未受管理的DLL添加到.NET项目中。

但是,您可以导入函数,例如参见平台调用教程


3

您正在尝试链接到一个未受管理的本地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完成了工作。 - Mike
David,我相信你是对的,因为你通常都是 :) 但请提供有关导出无意义的声明的参考。编译器如何知道要使哪些函数可见以进行导入? - Ville Krumlinde
@VilleKrumlinde exports 子句确定了哪些函数被导出。 - David Heffernan
谢谢David,我误解了你的意思,我以为你是说“exports”语句是无意义的。我忘记了“export”指令,我也不再使用它了。 - Ville Krumlinde

0

Henk 是正确的,我想再补充一些事情。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接