Delphi程序调用C#.Net编译的DLL并打开窗体(详解)

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


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





Tester程序:



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





C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务



原创作品,如转载请注明本文来自C/S框架网 www.csframework.com


Delphi/C#源码下载:

版权声明:本文为CSFramework文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

Delphi程序调用C#.Net编译DLL打开(详解)
C#调用C++编译DLL详解
C#.Net 调用Delphi 编译ActiveX COM组件(原)
通过反射,调用DLL程序集某个类静态方法打开
C#调用Delphi编译DLL函数库返回大文本数据
打开传入参数
C# 子调用方法(或多之间方法调用)
C# 动态编译调用WebService方法
指定单据号码自动打开业务单据显示数据
自定义按钮权限控制-扩展权限按钮详解
C#打开CHM文件定位到指定页面(原创)
C# 调用API枚举,根据标题还原
创建TreeList及打开TreeListNode.Tag属性对应
C#使用Process类运行外部程序,已运行程序自动还原主
Delphi封装Novell LDAP底层API, 提供给C#.Net开发
C#.Net多重继承构造器及Load事件执行顺序详解
C# WebService异步处理/异步调用详解
打开设计报错:To prevent possible data loss before loading the designer
C/S开发框架提供类似SAP系统快速命令,能快速打开界面(Command模式)
C#代码混淆及反编译