.NET 互操作
首先推荐一本书《精通.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 下载
.NET 互操作的更多相关文章
- 没有为 COM 互操作注册程序集 请使用 regasm.exe /tlb 注册该程序集——解决办法
错误现象: 错误 6 没有为 COM 互操作注册程序集“DevExpress.Utils.v13.1, Version=13.1.7.0, Culture=neutral, PublicKeyToke ...
- VS2013中, 无法嵌入互操作类型“……”,请改用适用的接口的解决方法
使用VS2013,在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示. 查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作 ...
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法(转自网络)
最近开始使用VS2010,在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示.查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌入 ...
- 与Java互操作
课程内容涵盖了Java互操作性. Javap 类 异常 特质 单例对象 闭包和函数 变化性 Javap javap的是JDK附带的一个工具.不是JRE,这里是有区别的. javap反编译类定义,给你展 ...
- Microsoft.Office.Interop.Excel 程序集引用 ,Microsoft.Office.Interop.Excel.ApplicationClass 无法嵌入互操作类型
using Microsoft.Office.Interop.Excel 添加程序集引用 方法:在引用--程序集--扩展中,添加引用Microsoft.Office.Interop.Excel,此 ...
- ArcEngine 无法嵌入互操作类型
说明: 在.net 4.0中,声明 IPoint point = new PointClass();会出现下面这个错误 错误 2 类型"ESRI.ArcGIS.Geometry.PointC ...
- 错误 24 无法嵌入互操作类型“ESRI.ArcGIS.Geometry.PointClass”。请改用适用的接口。 E:\MyGIS\MyGIS\Form1.cs 78 37 MyGIS
解决办法:选中那个引用,在属性页,将“嵌入互操作”设置为false
- 无法嵌入互操作类型“ESRI.ArcGIS.Carto.RectangleElementClass”。请改用适用的接口。
右键点击应用的程序集 ESRI.ArcGIS.Controls,修改"嵌入互操作类型"的值即可
- 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口
解决 把Microsoft.Office.Interop.Excel.DLL的嵌入互操作类型改为ture就可以了
- ArcEngine10.1二次开发错误: 无法嵌入互操作类型,请改用适用的接口
在之前配置ArcEngine.VS2010二次开发程序的时候,遇见"无法嵌入互操作类型,请改用适用的接口"的错误,在网上查了下,下面引用解决方法. 解决方式为在提示错误的引用上面右 ...
随机推荐
- 腾讯sdk配置
android-mirror.bugly.qq.com
- linux内核--几个上下文(context)
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为叫进程切换(process switch),任务切换(task switch)或上下文切换(con ...
- Spring各种注解标签作用详解
@Autowired和@Resource等注解是将Spring容器中的bean注入到属性,而@Component等注解是将bean放入Spring容器中管理. @Autowired spring2.1 ...
- ReactiveCocoa框架学习1
写block直接使用inline block的声明类型 在ARC中使用strong,如果不使用strong,则会被销毁 在非ARC中使用copy block在开发中的使用场景 把block保存到对象中 ...
- Linux主机安全配置的几个脚本【转载】
标签:linux Linux主机安全配置的几个脚本 职场 休闲原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hx100.blog ...
- 写一段方便的SQL 循环查每一天的数据
declare @recd int,@i int,@a int,@count int,@day1 date,@day2 date,@days int set @day1='2014-8-24' set ...
- Java 5种字符串拼接方式性能比较
http://blog.csdn.net/kimsoft/article/details/3353849 import java.util.ArrayList; import java.util.Li ...
- 设置myeclipse自动生成的author等注释
一.window->preference->java->code styple->code Template 当你选择到这部的时候就会看见右侧有一个框显示出code这个选 ...
- 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
在用本地的navicat连接服务器的mysql数据库时候出现下面的问题: 解决的方法: 解决方法: 1.改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhos ...
- RichtextBox打印
附件http://files.cnblogs.com/xe2011/CSHARP_RichtextBox_PRINT.rar 打印 详情 http://support.microsoft.com/kb ...