Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
Delphi程序调用C#.Net编译的DLL
最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是Delphi写的, 我不想再重复写一次,于是尝试编译成COM组件提供给Delphi调用.花了一下午研究技术, 结果很满意, 调试通过, 特分享受出来给大家学习.
实现步骤:
1、生成密钥文件用于给程序集强名称签名(必须)
sn -k MyKey.snk
2、使用强名称签名的Key编译成类库Tester.DLL
csc /t:library /keyfile:MyKey.snk Tester.cs
3、生成类型库 (此tlb文件提供给Delphi导入, 使用OLE方式调用此步可省略了)
tlbexp Tester.dll /out:Tester.tlb
4、生成注册DLL的注册表文件
regasm Tester.DLL /regfile:Tester.reg
5、运行Tester.reg
将上面四个步骤打包成一个BAT文件自动生成DLL, 在运行Delphi程序前请先运行Tester.reg注册COM.
打包Installer,Setup.exe 别忘记打包第5步.
sn -k MyKey.snk
csc /t:library /keyfile:MyKey.snk Tester.cs
tlbexp Tester.dll /out:Tester.tlb
regasm Tester.DLL /regfile:Tester.reg
且看运行效果:
Delphi程序Project1.exe (图片中英文拼写错误,不想改了,sorry!)

点Call DLL按钮成功打开.Net窗体,测试通过!

注意: 开发环境中必须在Visual Studio 2008命令提示中运行reg.bat!!! 如下图:


两种可能的错误提示及解决方案:
1. 出现以下提示说明没有注册COM组件, 请运行Tester.reg.

2. 出现以下提示说明您调用了一个没有签名的.Net方法(无参方法)

Tester程序:
/// <summary>
/// 测试类. 请给所有方法提供一个参数,即使是无用的签名
/// </summary>
public class Tester
{
public string GetMyKey(int param)
{
return "Key:www.csframework.com";
}
public string GetMyName(string input)
{
return "Jonny Sun" ":" input;
}
public int GetMyAge(string yourName)
{
return 33;
}
/// <summary>
/// 显示消息并打开窗体
/// </summary>
/// <param name="msg">消息</param>
/// <returns></returns>
public int ShowMessage(string msg)
{
MessageBox.Show(msg);
frmTest.Execute(msg);//打开窗体
return 100;
}
/// <summary>
/// 无签名(参数)的方法给Delphi调用,调用失败,Delphi程序会抛出异常。
/// </summary>
/// <returns></returns>
public int CallMethodWithNoSign()
{
return -1;
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
procedure TForm1.Button1Click(Sender: TObject);
var
OBJ: Variant; //OLEVariant Type.
ResultValue: string; //Value returned from C#
i:Integer;//Value returned from C#
begin
try
try
OBJ := CreateOleObject('Dll4DelphiCall.Tester');
//Test a function with signature.
ResultValue := OBJ.GetMyName('HELLO!C/S框架网 www.csframework.com');
ShowMessage(ResultValue);
ResultValue := OBJ.GetMyAge('JONNY!');
ShowMessage(ResultValue);
ResultValue := OBJ.GetMyKey(0);
ShowMessage(ResultValue);
i:=OBJ.ShowMessage('Call CSharp Window....(Sender:Delphi Form)');
ShowMessage(VarToStr(i));//Show result ID from C# function.
except
on e: Exception do
begin
ShowMessage(e.Message);
end;
end;
finally
OBJ := Unassigned;
end;
end;
// 来源:www.CSFramework.com, C/S结构框架学习网

原创作品,如转载请注明本文来自C/S框架网 www.csframework.com
Delphi/C#源码下载:
C#.Net 调用Delphi 编译的ActiveX COM组件(原)
C#调用C++编译的DLL详解
C#调用Delphi编译的DLL函数库返回大文本数据
Delphi封装Novell LDAP底层API, 提供给C#.Net开发
C# ASP.NET WebApi服务器搭建详解 - IIS服务承载(IIS Hosting IIS宿主)
建议使用.NET Reactor进行DLL,EXE加密后再发布给用户使用
.NET8 WebApi框架接口认证方式:Bearer Token/Jwt Token详解|C/S开发框架
DLL类库同时支持.NETFramework以及.NETCore(EF模型支持.NET双平台架构)|C/S开发框架
FastReport.NET2023报表数据源配置详解|C/S开发框架
C#.NET7 多线程播放mp3/wav音频|winmm.dll winapi播放音乐文件|C/S开发框架
.NET 6 优先队列 PriorityQueue 详解-C/S开发框架
C#.NET RESTFul API详解-C/S开发框架
C# FastReport.NET批量打印条形码报表详解教程-C/S开发框架
C# FastReport.NET批量打印条形码报表详解教程
C#.NET GC.Collect垃圾回收机制详解
ASP.NET MVC中几种常用的ActionResult详解
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
