首先要知道这个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中的方法了 (类名.方法名)。