1、 在c#中我们平时引用动态链接库Dll都在是在项目名上右击选择“添加应用”的方式将动态链接库Dll导入项目中,但是FANUC提供的动态链接库Dll无法直接这样导入,因为他没有托管到公共语言运行库,所以无法直接调用,这是我们就要用到DllImport来将其导入项目了。
2、DllImport默认在项目的exe所在目录查找Dll文件,也就是…\bin\Debug\目录下,所以我们只要将需要使用的Dll事先拷贝到该目录。
3、然后添加空间名引用:using System.Runtime.InteropServices;DllImport用于指定FANUC提供的动态链接库Dll位置在类中添加(DllImport只能放置在方法声明上):[DllImport("Fwlib32.dll", EntryPoint = "cnc_allclibhndl3")]
4、DllImport有6个参数,自己根据需求设置参数:1、CallingConvention参数:指入口点的调用,如果未指定则使用默认值CallingConvention.Winapi;2、CharSet参数:指用在入口点的字符集。如果未指定则使用默认值CharSet.Auto;3、EntryPoint参数:指声明的方法在dll中入口点的名称,如果未指定则使用方法本身的名称;4、ExactSpelling参数:指EntryPoint是否必须与指示的入口点的拼写完全匹配。如果未指定则使用默认值false;5、PreserveSig参数:指方法的签名应被应当被保留还是被转换,如果未指定则使用默认值false;6、SetLastError参数:指示方法是否保留Win32上的错误,如果未指定则使用默认值false。
5、引用了FANUC提供的动态链接库Dll,接下来就是使用该Dll了,用DllImport修饰的方法必须用static extern修饰符定义该方法:/* allocate library handle 3 */[DllImport("FWLIB32.dll", EntryPoint="cnc_allclibhndl3")]public static extern short cnc_allclibhndl3( [In,MarshalAs(UnmanagedType.AsAny)] Object ip, ushort port,int timeout, out ushort FlibHndl);
6、有了该方法我们就可以定义对应的参数并赋值给该方法来获取我们需要的参数,在文档中有说明相应的参数含义,我们根据文档定义好相应的参数:
7、将参数传入函数Focas1.cnc_allclibhndl3函数中,并获得返回值,文档Return Status of Data Window Functions中给我们提供了各种返回参数的含义,可以拿来对比。
8、public ushort h;//返回的值private void button1_Click(object sender, EventArgs e){ string ip = textBox1.Text;//IP地址:127.0.0.1 string port = textBox2.Text;//端口号:8888 string timeout = textBox3.Text;//延迟时间(秒):10 int ret = Focas1.cnc_allclibhndl3(ip, Convert.ToUInt16(port), Convert.ToInt32(timeout), out h);//获取函数的返回值 //Focas1.cnc_rdparam(fwlibhandleDic[no], 6711, 0, 8, prm_rd); if (ret == Focas1.EW_OK)//跟系统提供的参数进行对比,EW_OK返回值为0(Normal termination:正常结束),即表示成功 { MessageBox.Show("连接成功!"); } else { MessageBox.Show(ret + "-连接失败!"); }}