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方法(无参方法)
/// <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结构框架学习网
源码在360云盘
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)的更多相关文章
- 解决C#程序只允许运行一个实例的几种方法详解
解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...
- (转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...
- CentOS7编译安装php7.1配置教程详解
这篇文章主要介绍CentOS7编译安装php7.1的过程和配置详解,亲测 ,需要的朋友可以参考. 1.首先安装依赖包: yum install libxml2 libxml2-devel openss ...
- C#调用外部DLL介绍及使用详解
一. DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...
- Delphi 7调用C语言编写的DLL
DLL一定是要C语言导出的符号,也就是extern “C”. 当然,我们都知道DLL调用分为动态调用和静态调用. 动态调用的一般思想为,先LoadLibrary那个你想加载的DLL,然后通过GetPr ...
- 雅奇880、990、小土豆调用EPX Studio 编译的DLL的编程方法~
在雅奇990中,使用“外部文件-调用链接库文件”命令实现与EP的通信,例如: 1.调用链接库文件(取项目文件信息() + '资源文件\Project1.dll', 'Unit1.rpas:Result ...
- [转]Android调用so文件(C代码库)方法详解
一.为什么调用c的dll要用源码编译成so库 Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用. 二.安装 ...
- C/C++程序内存的各种变量存储区域和各个区域详解
转自 https://blog.csdn.net/jirryzhang/article/details/79518408 C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名 ...
- 我的第一个Python程序,定义主函数,eval、format函数详解,
程序实例: #第一个py小程序 def main(): f = eval(input("输入一个数值:")) p=f*(5/9) print("现在的值为:{0:3.3f ...
随机推荐
- 考虑下面两个JSP文件代码片断: test1.jsp:
<HTML> <BODY> <% pageContext.setAttribute(”ten”,new Integer(10));%> //1 </BODY& ...
- iScroll框架的使用和修改
iScroll 的诞生是因为手机 Webkit 浏览器(iPhone.iPod.Android 和 Pre)本身没有为固定宽度和高度的元素提供滚动内容的方法.这导致了很多网页使用 position:a ...
- jQuery编程中的一些核心方法简介
调用 jQuery 对象的方法很简单: $('h1').remove(); 大多数 jQuery 方法都是像上面这样被调用的,这些方法都位于 $.fn 命名空间内,这些方法称为 jQuery 对象方法 ...
- CSS代码重构与优化
CSS代码重构的基本方法 前面说到了CSS代码重构的目的,现在我们来说说一些如何达到这些目的的一些基本方法,这些方法都是易于理解,容易实施的一些手段,大家平时可能也不知不觉地在使用它. 提高CSS性能 ...
- [深入理解Android卷一全文-第八章]深入理解Surface系统
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...
- ios开发之--系统控件显示中文
虽然一直知道X-code肯定提供有语言本地化的设置地方,但是一直也做个记录,有些时候的汉化,还是需要使用代码去控制,键盘的右下角.navagiton的return使用代码修改,调用系统相机时,也是出现 ...
- Python学习笔记5-元组Tuple
tuple和list非常类似,但是tuple一旦初始化就不能修改,它也没有append(),insert()这样的方法.其他获取元素的方法和list是一样的 元组是用圆括号括起来的,其中的元素之间用逗 ...
- 1455: 罗马游戏[左偏树or可并堆]
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1861 Solved: 798[Submit][Status][Discuss] ...
- ios 去掉UITableView Group形式下面的白色阴影
初始化的时候 设置_tableView.separatorStyle = UITableViewCellSeparatorStrleNone;
- 170322、Spring Boot 性能优化之将Servlet容器变成Undertow
需求缘起:在研究Spring Boot加速启动的时候,发现我们在实际中,可能比较注重我们服务器的内存的情况,那么我们会想如果在启动的时候,所占用的内存越低是越好,基于这个想法,我们看看Spring B ...