zoukankan      html  css  js  c++  java
  • 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方法(无参方法)




    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云盘


  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/honeynm/p/5049031.html
Copyright © 2011-2022 走看看