每種編程語言調用DLL的方法都不盡相同,在此只對用C#調用Delphi DLL的方法進行介紹
首先要搞清楚一點的是:什么是托管,什么是非托管?
一般可以認為:非托管代碼主要是基於win 32平台開發的DLL,activeX的組件,托管代碼是基於.net平台開發的
C# 調用DLL中的非托管函數一般方法
首先,應該在C#語言源程序中聲明外部方法,其基本形式是:
[DLLImport(“DLL文件”)]
修飾符 extern 返回變量類型 方法名稱 (參數列表)
其中:
DLL文件:包含定義外部方法的庫文件。
修飾符: 訪問修飾符,除了abstract以外在聲明方法時可以使用的修飾符。
返回變量類型:在DLL文件中你需調用方法的返回變量類型。
方法名稱:在DLL文件中你需調用方法的名稱。
參數列表:在DLL文件中你需調用方法的列表。
注意:需要在程序聲明中使用System.Runtime.InteropServices命名空間。
DllImport只能放置在方法聲明上。
DLL文件必須位於程序當前目錄或系統定義的查詢路徑中(即:系統環境變量中Path所設置的路徑)。
返回變量類型、方法名稱、參數列表一定要與DLL文件中的定義相一致。
下面結合示例如:
[DllImport("TestDll.dll", EntryPoint = "SayHello")] "TestDll.dll"為dll名稱,EntryPoint 為函數名
static extern string SayHello(string Name); //delphi 中的函數
private string GetMessage() //C#自己寫的函數,並調用Dll函數
{
return SayHello("");
}
當前程序中調用 GetMessage時就會返回Dll SayHello 函數的內容
其中,Dll SayHello函數如下(Delphi語言):
function SayHello(NameTool:PChar):PChar;stdcall;
begin
if Length(NameTool) <=0 then
Result := PChar('Hello Person,welcome to chian.')
else
Result := PChar('Hello '+ NameTool + ', welcome to chian.');
end;
另外,如果需要調用傳值,的方法時,通過Delphi的參數 var 與C#中的ref關鍵字結合使用如:
procedure ChangeNumber(var number:Integer);stdcall;
begin
number := 100;
end;
C#調用如下:
private int MyNumber = 150;
[DllImport("TestDll.dll", EntryPoint = "ChangeNumber")]
static extern void ChangeNumber(ref int count);
private void Changes()
{
ChangeNumber(ref MyNumber);
}
當C#程序中調用 Changes方法后,MyNumber的值將會改變為100
以上為C#簡單調用Delphi Dll的方法。其中要注意的有:
DLL文件必須位於程序當前目錄或系統定義的查詢路徑中(即:系統環境變量中Path所設置的路徑)。
返回變量類型、方法名稱、參數列表一定要與DLL文件中的定義相一致。