標籤: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(摘自網路)