Delphi程序調用C#.Net編譯的DLL並打開窗體(詳解)

Delphi程序調用C#.Net編譯的DLL並打開窗體(詳解)

最近用C#.Net寫了一個公用模塊, 本覺得僅提供給.Net程序使用, 可是領導要求把這些功能提供給舊系統使用, 天啦, 幾套舊系統全是Delphi寫的, 我不想再重複寫一次,因而嘗試編譯成COM組件提供給Delphi調用.花了一下午研究技術, 結果很滿意, 調試經過, 特分享受出來給你們學習.

實現步驟:

一、生成密鑰文件用於給程序集強名稱簽名(必須)
sn -k MyKey.snk 框架

二、使用強名稱簽名的Key編譯成類庫Tester.DLL
csc /t:library /keyfile:MyKey.snk Tester.cs
學習

三、生成類型庫 (此tlb文件提供給Delphi導入, 使用OLE方式調用此步可省略了)
tlbexp Tester.dll /out:Tester.tlb

四、生成註冊DLL的註冊表文件
regasm Tester.DLL /regfile:Tester.reg

五、運行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方法(無參方法)




spa

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);code

      ResultValue := OBJ.GetMyKey(0);
      ShowMessage(ResultValue);orm

      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;blog

end;圖片



// 來源:www.CSFramework.com, C/S結構框架學習網

源碼在360雲盤


開發

相關文章
相關標籤/搜索