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 组件。

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

任何如何解决问题的建议表示赞赏。

4

3 回答 3

6

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

但是您可以导入函数,例如参见Platform Invoke Tutorial

于 2012-04-10T12:20:46.517 回答
3

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

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

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

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

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

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

于 2012-04-10T13:15:32.383 回答
0

Henk is right and I want to add a few things.

First of all, You can add a dll only if it is a .NET managed dll(which calls assembly). But you can import unmanged functions from unmanaged dll or exe files. So the right question is how I can import functions from unmanaged dll, and you should seek the answer for it. And I think the best start position is pinvoke website.

于 2012-04-10T13:09:32.980 回答