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


实现步骤:

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




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


Delphi/C#源码下载:

http://pan.baidu.com/s/1ceBTp

本文来自C/S框架网

 

转载于:https://www.cnblogs.com/http-www/p/3363539.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值