delphi调用C#DLL,非com,请给出c#和delphi的示例代码
时间: 2024-10-06 13:01:29 浏览: 39
在Delphi中,如果你需要调用C#非COM DLL,你需要使用PInvoke (Platform Invoke)技术,这是一种进程间通信的方式,允许 Delphi 应用程序直接调用其他语言编写的动态链接库(DLL)。以下是简单的C#和Delphi代码示例:
**C# 示例 - 非COM API的简单函数(假设有一个名为`AddNumbers`的静态方法,接受两个int并返回它们的和):**
```csharp
using System;
public class MathLibrary
{
[DllImport("MathLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AddNumbers(int a, int b);
}
class Program
{
static void Main(string[] args)
{
int result = MathLibrary.AddNumbers(10, 20);
Console.WriteLine($"The sum is: {result}");
}
}
```
**Delphi 示例 - 调用C# DLL中的函数:**
首先,在Delphi项目中,你需要包含`Windows.pas`和`SysUtils.pas`,因为PInvoke通常在这个范围内工作。
```pascal
unit Unit1;
interface
uses
Windows, SysUtils;
type
DLLResult = integer;
function CallAddNumbers(a, b: Integer): DLLResult; stdcall;
implementation
{$R *.res}
procedure PInvokeAddNumbers(const HModule: HMODULE; FuncAddress: Pointer; Args: array of Pointer; ResultSize: Integer): DLLResult;
var
Result: DLLResult;
begin
Result := Marshal.CallLastWinApi(FuncAddress, ResultSize, @Args[0], @Args[1]);
// 检查结果并处理异常(如果需要)
end;
function CallAddNumbers(a, b: Integer): DLLResult;
asm
; Load the function address from the DLL
mov eax, [HMODULE + FunctionAddressOffset]
; Make a call using PInvoke
call PInvokeAddNumbers
end;
// 假设dll名称为 'MathLibrary.dll'
const
DllName = 'MathLibrary.dll';
FunctionAddressOffset = $FFC; // C# DLL中的AddNumbers函数地址偏移量假设为4字节
var
HModule: HMODULE;
begin
HModule := LoadLibrary(PChar(DllName));
if HModule <> 0 then try
Result := CallAddNumbers(10, 20); // 调用C#中的AddNumbers函数
// 打印结果
Writeln('Result from C# DLL: ', Result);
finally
FreeLibrary(HModule);
end;
end.
end.
```
记得将`FunctionAddressOffset`替换为你实际找到的`AddNumbers`函数的地址,并且确保Delphi项目和C#库位于同一目录下,或者提供正确的路径到DLL。
阅读全文