zoukankan      html  css  js  c++  java
  • 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框架网

     
  • 相关阅读:
    主从服务器配置与服务----有图
    密钥ssh 配置操作
    用户权限的sudo管理
    系统进程与计划任务管理
    文件系统--磁盘空间耗尽--磁盘坏道 处理以上问题
    MySQL字符串函数:substring_index()的使用详解
    MySQL字符串函数:locate()使用方法详解
    PHP 常用特殊字符的各种表示
    PHP get_headers()函数详解
    PHP urlencode()和urldecode()函数详解
  • 原文地址:https://www.cnblogs.com/http-www/p/3363539.html
Copyright © 2011-2022 走看看