C#调用mfc的dll后面的接口函数怎么写?
2009-06-23 10:29
375 查看
C#调用mfc的dll后面的接口函数怎么写?
在使用外部的非.NET托管的DLL的时候,通常你要知道这个dll中公开了那些接口(一般情况下只有公开的方法有用)。
例如:在一个用C语言编写的用来读取串口上IC卡读卡器的dll中公开了如下的方法。
int auto_init(int port,ulong baud);
这个方法是用来自动初始话读卡器的。我们在C#中就要通过dllImport的方式来使用这个接口。首先程序集要引用using System.Runtime.InteropServices命名空间。然后在我们的程序中声明要引用的这个方法。
[DllImport("Mwic_32.dll")]
public static unsafe extern int ic_init(int port,ulong baud);
特殊属性DllImport的构造函数中输入的是所引用的dll的中文名称或者全名称,如果输入的只是文件名那么系统会在运行目录下寻找文件名为指定名称的程序集。注意声明的引用必须是static unsafe extern 类型的。其他的形式就跟dll中定义的一样。这样声明之后,我们就可以在自己的代码里面就像调用方法一样的使用这个方法了。
在使用的时候,因为我们调用的是一段非托管代码,因此就必须在非托管方法中使用,声明非托管方法的形式如下。
/// <summary>
/// 初始化RD系列通用读卡器的方法。(本方法调用非托管代码)
/// </summary>
public unsafe void initMachine()
{
this.opened=true;
this.st=this.icdev=ic_init(this.port,9600);
if(this.st<0)
{
this.error(this.st);
this.opened=false;
return;
}
this.st=this.getState(this.icdev);
if(st<0)
{
this.error(this.st);
this.opened=false;
return;
}
//System.Windows.Forms.MessageBox.Show(this.getCardType());
this.deep(10);
}
注意在声明非托管方法的时候方法前面必须添加unsafe字段已标明这个方法是非托管的。在这个方法内部所使用的数据类型可以使用C#的类型也能够使用C或者C++的数据类型。
如果你只是做一般性的调用的话,上面的方法就足够用了。在使用的时候,托管的代码可以任意调用这些非托管的方法。需要注意的就是在调用非托管代码时最好做好异常检测。另外一个常见的问题就是通常非托管中使用的值类型与托管中的不同,而且经常非托管中的方法的参数使用的都是指针,这时就要注意怎样将托管类型转换为指针。例如在上面这个读卡dll中有一个int get_status(int icdev,int* state)方法,在这个方法中有一个参数时一个指针。声明这个方法的方式是:
[DllImport("Mwic_32.dll")]
public static unsafe extern int get_status(int icdev,int* state);
在使用这个方法的适合,就可能会出现歧异因为在C#中没有int*类型,因此我们就要利用C#的表现形式来为这个方法输入参数,方法如下:
/// <summary>
/// 检查读卡器的插卡状态
/// </summary>
/// <param name="icdev"></param>
/// <returns></returns>
public unsafe int getState(int icdev)
{
int i=2;
int st=RD.get_status(this.icdev,&i);
this.status=i;
return i;
}
在使用外部的非.NET托管的DLL的时候,通常你要知道这个dll中公开了那些接口(一般情况下只有公开的方法有用)。
例如:在一个用C语言编写的用来读取串口上IC卡读卡器的dll中公开了如下的方法。
int auto_init(int port,ulong baud);
这个方法是用来自动初始话读卡器的。我们在C#中就要通过dllImport的方式来使用这个接口。首先程序集要引用using System.Runtime.InteropServices命名空间。然后在我们的程序中声明要引用的这个方法。
[DllImport("Mwic_32.dll")]
public static unsafe extern int ic_init(int port,ulong baud);
特殊属性DllImport的构造函数中输入的是所引用的dll的中文名称或者全名称,如果输入的只是文件名那么系统会在运行目录下寻找文件名为指定名称的程序集。注意声明的引用必须是static unsafe extern 类型的。其他的形式就跟dll中定义的一样。这样声明之后,我们就可以在自己的代码里面就像调用方法一样的使用这个方法了。
在使用的时候,因为我们调用的是一段非托管代码,因此就必须在非托管方法中使用,声明非托管方法的形式如下。
/// <summary>
/// 初始化RD系列通用读卡器的方法。(本方法调用非托管代码)
/// </summary>
public unsafe void initMachine()
{
this.opened=true;
this.st=this.icdev=ic_init(this.port,9600);
if(this.st<0)
{
this.error(this.st);
this.opened=false;
return;
}
this.st=this.getState(this.icdev);
if(st<0)
{
this.error(this.st);
this.opened=false;
return;
}
//System.Windows.Forms.MessageBox.Show(this.getCardType());
this.deep(10);
}
注意在声明非托管方法的时候方法前面必须添加unsafe字段已标明这个方法是非托管的。在这个方法内部所使用的数据类型可以使用C#的类型也能够使用C或者C++的数据类型。
如果你只是做一般性的调用的话,上面的方法就足够用了。在使用的时候,托管的代码可以任意调用这些非托管的方法。需要注意的就是在调用非托管代码时最好做好异常检测。另外一个常见的问题就是通常非托管中使用的值类型与托管中的不同,而且经常非托管中的方法的参数使用的都是指针,这时就要注意怎样将托管类型转换为指针。例如在上面这个读卡dll中有一个int get_status(int icdev,int* state)方法,在这个方法中有一个参数时一个指针。声明这个方法的方式是:
[DllImport("Mwic_32.dll")]
public static unsafe extern int get_status(int icdev,int* state);
在使用这个方法的适合,就可能会出现歧异因为在C#中没有int*类型,因此我们就要利用C#的表现形式来为这个方法输入参数,方法如下:
/// <summary>
/// 检查读卡器的插卡状态
/// </summary>
/// <param name="icdev"></param>
/// <returns></returns>
public unsafe int getState(int icdev)
{
int i=2;
int st=RD.get_status(this.icdev,&i);
this.status=i;
return i;
}
相关文章推荐
- C#怎么调用dll接口
- MFC调用c#的dll
- MFC调用c#的dll
- C#写好的类库dll怎么在别人调用的时候也能看到注释?
- VC++ (MFC)调用 C#生成DLL的方法
- 如何在MFC中调用C#编写的DLL
- C#调用C++dll 中具有高维指针参数的接口函数
- C# 调用 C++ MFC DLL
- C#调用C++动态链接库之Win32dll(函数)、MFCdll(对话框)
- 怎么使用C#调用C++ dll 类库
- 智能设备 C#调用MFC DLL 传参值为汉字的解决方案 CString转存 unsigned char数组
- MFC 怎么 调用dll文件里带结构体的函数 求大神
- C#调用mfc写的Dll出现调用导致堆栈不对称问题
- 自定义序列化4 (MFC调用C#的.dll)
- VS2010 (MFC)调用 C#生成DLL的两种方法
- C#调用MFC 窗口 DLL
- 如何利用MFC编写的.exe调用C#编写的dll动态库
- C#写好的类库dll怎么在别人调用的时候也能看到注释?
- MFC中调用C# DLL库
- wince C# 调用 mfc dll 返回字符串乱码之解决方案[转]