Delphi調用C#動態連結程式庫DLL(摘自網路)

來源:互聯網
上載者:User

標籤:installer   註冊表   library   網路   動態   

實現步驟:

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>
publicclass Tester
{
   
   publicstring GetMyKey(int param)
   {
      return "Key:www.csframework.com";
   }
   
   publicstring GetMyName(string input)
   {
      return "Jonny Sun" ":" input;
   }
   
   publicint GetMyAge(string yourName)
   {
      return 33;
   }
   
   /// <summary>
   /// 顯示訊息並開啟表單
   /// </summary>
   /// <param name="msg">訊息</param>
   /// <returns></returns>
   publicint ShowMessage(string msg)
   {
      MessageBox.Show(msg);
      frmTest.Execute(msg);//開啟表單
      return 100;
   }
   
   /// <summary>
   /// 無簽名(參數)的方法給Delphi調用,調用失敗,Delphi程式會拋出異常。
   /// </summary>
   /// <returns></returns>
   publicint CallMethodWithNoSign()
   {
      return -1;
   }
   
}

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 CSharpWindow....(Sender:Delphi Form)‘);
      ShowMessage(VarToStr(i));//Show result ID fromC# function.
    except
      on e: Exception do
      begin
        ShowMessage(e.Message);
      end;
    end;
  finally
    OBJ := Unassigned;
  end;

end;

 


本文出自 “暢想天空” 部落格,請務必保留此出處http://kinwar.blog.51cto.com/3723399/1617588

Delphi調用C#動態連結程式庫DLL(摘自網路)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.