首先推荐一本书《精通.NET 互操作》 ,这本书是目前中文资料里讲 互操作最详尽的书了。
做系统集成项目的同学应该都和设备打过交道(如视频设备:海康、大华等),在大多数情况下这些设备厂商会给系统集成厂商开发协议(dll 类库、 函数定义的头文件、测试程序、调用流程),这些协议的dll 大都用C++开发的,那么我们用C#集成,就得用 P/Invoke 技术(.NET 互操作的一种)
一、P/Invoke 简单例子
P/Invoke 说白了,就是你调用协议dll 的函数,传入正确的参数(注意C++与C#的数据类型转换)
例子:
using System.Runtime.InteropServices; class App
{
[DllImport("msvcrt.dll")]
static extern int puts(string msg); [DllImport("msvcrt.dll")]
static extern int _flushall(); static void Main()
{
puts("Hello World");
_flushall();
CreateMsgWindow();
} [DllImport("user32.dll",EntryPoint="MessageBox")]
static extern int MessageBox(int hwnd,string lpText,string lpCaption,int wType); static void CreateMsgWindow()
{
MessageBox(,"Hello world!","Welcome",);
}
}
二、两款 dll 函数查看工具
1. Dll Export Viewer
2. Dll 函数查看器 2.0
三、C#与C++常见类型对比
C++ 类型 | C# 类型 |
HANDLE (void *)括号内是等价类型 | IntPtr |
Byte(unsigned char) | byte |
SHORT(short) | short |
WORD(unsigned short) | short |
INT(int) | int |
int* | ref int |
UINT(unsigned int) | int |
LONG(long) | int |
ULONG(unsigned long) | uint |
DWORD(unsigned long) | uint |
BOOL(long) | bool |
PCAHR(char *) | string |
char[] | string |
PBYTE(byte *) | byte[] |
结构体 | publlic struct 结构体{} |
char **变量名 | ref string 变量名 |
结构体封装
// 协议头文件中的结构体
typedef struct
{
char sLibName[ ];
char sPathToLibrary[ ];
INT32 iEntries;
INT32 iUsed;
UINT16 iSort;
UINT16 iVersion;
BOOLEAN fContainsSubDirectories;
INT32 iReserved;
} LIBHEADER; // C#协议包裹类中的对应结构
[StructLayout(LayoutKind.Sequential)]
public struct LIBHEADER
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public char[] sLibName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public char[] sPathToLibrary;
public int iEntries;
public int iUsed;
public ushort iSort;
public ushort iVersion;
public bool fContainsSubDirectories;
public int iReserved;
}
附:
2. Dll Export Viewer 下载
3. Dll 函数查看器 2.0 下载