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步.

reg.bat 文件内容:

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方法(无参方法)

C# Code:

/// <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结构框架学习网

Delphi Code:

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并打开窗体(详解)的更多相关文章

  1. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...

  2. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  3. CentOS7编译安装php7.1配置教程详解

    这篇文章主要介绍CentOS7编译安装php7.1的过程和配置详解,亲测 ,需要的朋友可以参考. 1.首先安装依赖包: yum install libxml2 libxml2-devel openss ...

  4. C#调用外部DLL介绍及使用详解

    一.      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...

  5. Delphi 7调用C语言编写的DLL

    DLL一定是要C语言导出的符号,也就是extern “C”. 当然,我们都知道DLL调用分为动态调用和静态调用. 动态调用的一般思想为,先LoadLibrary那个你想加载的DLL,然后通过GetPr ...

  6. 雅奇880、990、小土豆调用EPX Studio 编译的DLL的编程方法~

    在雅奇990中,使用“外部文件-调用链接库文件”命令实现与EP的通信,例如: 1.调用链接库文件(取项目文件信息() + '资源文件\Project1.dll', 'Unit1.rpas:Result ...

  7. [转]Android调用so文件(C代码库)方法详解

    一.为什么调用c的dll要用源码编译成so库 Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用. 二.安装 ...

  8. C/C++程序内存的各种变量存储区域和各个区域详解

    转自 https://blog.csdn.net/jirryzhang/article/details/79518408 C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名 ...

  9. 我的第一个Python程序,定义主函数,eval、format函数详解,

    程序实例: #第一个py小程序 def main(): f = eval(input("输入一个数值:")) p=f*(5/9) print("现在的值为:{0:3.3f ...

随机推荐

  1. ThinkPHP项目笔记之RBAC(权限)上篇

    当理清这5个表的关系,接下来,就是功能介绍了.

  2. 全新的membership框架Asp.net Identity——绕不过的Claims

    http://www.cnblogs.com/JustRun1983/p/4708176.html?utm_source=tuicool&utm_medium=referral

  3. Tanks案例笔记(一、场景搭建)

    一.场景搭建 1.首先我们导入案例的资源,然后新建一个空场景: 2.资源中为我们准备的场景的预制,我们直接把LevelArt预制拖到Hierarchy面板: 3.移除场景中默认的光源: 4.确保物体的 ...

  4. 将list列表中unicode类型的值转换为字符串类型

  5. java基础---->string字面量的使用

    这里简单的理解一下java中关于string字面量的知识,关于字节码可以使用java自带的javap工具查看. string字面量 一.直接贴出测试的代码 A string literal alway ...

  6. Go基础---->go的第一个程序

    今天我们学习搭建一个学习go语言的开发环境. Go语言 一.下载go 下载地址:https://golang.org/dl/ 校验下载,在命令行输入go version 二.编写第一个hello wo ...

  7. rimraf删除gulp的模块插件

    1.安装:npm install -g rimraf(全局安装),如果安装了cnpm,也可使用cnpm install -g rimraf 命令 2.使用:先定位目标文件夹的父级目录,然后命令行输入r ...

  8. Django学习笔记第四篇--数据处理URL和数据库

    一.URL: 1.基础的URL与视图函数的映射 from django.conf.urls import url from django.contrib import admin from appna ...

  9. 逐一取Map值

    String[] mKeys = starDetil.getRows().keySet().toArray(new String[starDetil.getRows().size()]); starD ...

  10. nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍

    转自:http://blog.csdn.net/happydream_c/article/details/54943802 一.nginx简介 Nginx (发音为[engine x])专为性能优化而 ...