首先要知道這個DLL中提供了那些方法,這些方法是怎麼聲明的。如下面這兩種形式:
function ShowRPMenuList (SQLConnPChar:PChar; FBCID:PChar):Integer;
function GetRPMenuList(RPTConnString:Pchar;FBCID:Pchar):PChar;
然後就是做一些準備工作了:
1、在C#程序主目錄下建立一個Lib文件夾,將所有的DLL文件都可以放裏面,然後在VS中的”解決方案資源管理器”中項目名上點右鍵,選擇屬性,點擊生成事件,在”生成後事件命令行”下的文本框中寫下面語句:copy $(SolutionDir)lib/(DLL文件名)。
(DllImport會按照順序自動去尋找的地方:
1、exe所在目錄
2、System32目錄
3、環境變量目錄
所以只需要你把引用的DLL 拷貝到這三個目錄下 就可以不用寫路徑了
)
2、現在可以在程序中調用不帶類型庫的 DLL 中的函數了,一般把所有調用方法放在一個類裏,並且這些調用方法要定義成靜態的(static),格式如下:
[DllImport("xxx.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr get_file(string szHostAddr, string szRemoteFile, string szLocalFile, short option);
[DllImport("yyy.dll", CharSet = CharSet.Ansi, EntryPoint = "PGREC_CreateRecordObject")]
public static extern IntPtr CreateRecordObject(PGLIB_DATA_TYPE dataType);
解釋:
①、前面的public static extern可以作爲固定格式來寫。
②、Integer型轉換成IntPtr,其實作爲返回值的Integer型多數情況下和bool型的性質一樣,在C#程序裏判斷返回值是不是等於IntPtr.Zero。
③、PChar型就是C#中的string型。
④、後面的EntryPoint = "PGREC_CreateRecordObject"是對應PB中的函數名。
3、現在在程序裏就可以調用這個PB中的方法了 (類名.方法名)。