C#调用非托管dll,并从dll中再调用C#中的方法

从Delphi DLL调用C#方法:一种高效的跨语言集成方案

在软件开发中,我们经常遇到需要集成不同语言编写的组件的情况。

例如,使用C#开发的现代应用程序可能需要调用一些用Delphi编写的老DLL。

如果直接在Delphi中实现某些功能存在困难,

我们可以考虑一种反向调用的策略:

从Delphi调用回C#的方法。

本文将介绍如何实现这一过程。

背景

Delphi是一种历史悠久的编程语言,拥有大量的遗留代码库。

C#则是一种现代、功能丰富的语言,广泛用于.NET平台。

有时,我们需要在这两种语言之间进行交互。

实现步骤

1. 在Delphi中定义函数类型和导出函数

首先,在Delphi中定义一个与C#方法签名匹配的函数类型,

并导出一个可以接收C#函数指针的函数:

delphi 复制代码
library testDLL;

uses
  SysUtils,
  Dialogs,
  Classes;

{$R *.res}

type
  TMyFunction = function(param: Integer): Integer; stdcall;

function MyFunction1(param1: Integer): Integer; stdcall;
var
  cSharpFunction: TMyFunction;
begin
  // 假设cSharpFunction已经在外部被赋值
  Result := cSharpFunction(param1);
end;

exports
  MyFunction1;

begin
end.

2. 在C#中定义委托并实现方法

接着,在C#中定义一个与Delphi中定义的函数类型匹配的委托,

并实现一个方法供Delphi调用:

csharp 复制代码
using System;
using System.Runtime.InteropServices;



class Program
{
	// 导入DLL中的函数
    [DllImport("testDLL.dll")]
    static extern int MyFunction1(int a);
    // 定义与Delphi DLL中函数签名匹配的委托
	public delegate int MyFunctionDelegate(int param1);
	
	// C#中需要被Delphi调用的方法
	static int MyFunction(int a)
	{
	    MessageBox.Show("Function called from Delphi!");
	    return a;
	}
    static void Main()
    {
        // 创建委托实例
        MyFunctionDelegate myDelegate = new MyFunctionDelegate(MyFunction);

        // 获取委托的指针
        IntPtr funcptr = Marshal.GetFunctionPointerForDelegate(myDelegate);

        // 调用Delphi函数并传递C#函数的指针
        int result = MyFunction1(funcptr.ToInt32());
        Console.WriteLine("Result from Delphi call: " + result);
    }
}

注意事项

  • 确保C#和Delphi之间的数据类型匹配,特别是在处理字符串和复杂数据结构时。
  • 委托的指针需要正确传递,并且在Delphi中正确解析和使用。
  • 跨语言调用可能会涉及到内存管理和异常处理的复杂性,需要仔细测试以确保稳定性。

结论

通过上述步骤,我们可以实现从Delphi DLL调用C#方法,

这为跨语言集成提供了一种灵活的解决方案。

这种方法特别适用于需要利用现有Delphi代码库,

同时发挥C#语言优势的场景。

相关推荐
重生之小比特几秒前
【Java SE】运算符
java·开发语言
fujisheng661几秒前
FUI 绑定生命周期实战:可靠解绑、失败回滚与列表项换绑
c#·unity3d
Patrick在香港9 分钟前
Claude + Python 数据管道:一次字段改名,786 行历史数据被静默重写
开发语言·windows·python·claude·数据工程·数据校验·数据管道
CodeStats26 分钟前
【Java数据类型】Java底层数据类型原理(下):时间API、JSON与String存储演进
java·开发语言·数据类型·string·byte
Brilliantwxx36 分钟前
【STM32 】把 printf 搬到串口上 —— C 标准 IO 函数重定向与多文件工程搭建(实战串口电灯)
c语言·开发语言·stm32·单片机·嵌入式硬件·架构·ecmascript
流浪00140 分钟前
大厂 C/C++ 2023–2025 面试答案题汇总
开发语言·c++
Yanjun2i42 分钟前
Agent学习记录六:Tool 类 + Tool Registry
开发语言·python·学习
一条泥憨鱼1 小时前
【从0开始学习计算机网络】| TIME_WAIT 为什么是 2MSL,CLOSE_WAIT / TIME_WAIT 堆积怎么排查
服务器·开发语言·网络·计算机网络·网络安全
(Charon)1 小时前
【C++】 定时器入门:从定时任务到 epoll 驱动
开发语言·c++
亮_一个嵌入式新手1 小时前
C语言Day21
c语言·开发语言