.NET 互操作

  首先推荐一本书《精通.NET 互操作》 ,这本书是目前中文资料里讲 互操作最详尽的书了。

  做系统集成项目的同学应该都和设备打过交道(如视频设备:海康、大华等),在大多数情况下这些设备厂商会给系统集成厂商开发协议(dll 类库、 函数定义的头文件、测试程序、调用流程),这些协议的dll 大都用C++开发的,那么我们用C#集成,就得用 P/Invoke 技术(.NET 互操作的一种)

一、P/Invoke 简单例子

  P/Invoke 说白了,就是你调用协议dll 的函数,传入正确的参数(注意C++与C#的数据类型转换)

  例子:

 1 using System.Runtime.InteropServices;
 2
 3 class App
 4 {
 5     [DllImport("msvcrt.dll")]
 6     static extern int puts(string msg);
 7
 8     [DllImport("msvcrt.dll")]
 9     static extern int _flushall();
10
11     static void Main()
12     {
13         puts("Hello World");
14         _flushall();
15         CreateMsgWindow();
16     }
17
18
19     [DllImport("user32.dll",EntryPoint="MessageBox")]
20     static extern int MessageBox(int hwnd,string lpText,string lpCaption,int wType);
21
22     static void CreateMsgWindow()
23     {
24         MessageBox(0,"Hello world!","Welcome",0);
25     }
26 }

二、两款 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 变量名

结构体封装

 1 // 协议头文件中的结构体
 2 typedef struct
 3 {
 4     char  sLibName[ 256 ];
 5     char  sPathToLibrary[ 256 ];
 6     INT32       iEntries;
 7     INT32       iUsed;
 8     UINT16     iSort;
 9     UINT16     iVersion;
10     BOOLEAN     fContainsSubDirectories;
11     INT32       iReserved;
12 } LIBHEADER;
13
14 // C#协议包裹类中的对应结构
15 [StructLayout(LayoutKind.Sequential)]
16 public struct LIBHEADER
17 {
18     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
19     public char[] sLibName;
20     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
21     public char[] sPathToLibrary;
22     public int iEntries;
23     public int iUsed;
24     public ushort iSort;
25     public ushort iVersion;
26     public bool fContainsSubDirectories;
27     public int iReserved;
28 }  

附:

1. 精通.NET 互操作 pdfiso 下载

2. Dll Export Viewer 下载

3. Dll 函数查看器 2.0 下载

时间: 2024-10-25 11:10:33

.NET 互操作的相关文章

CUDA与OpenGL互操作

当处理较大数据量的时候,往往会用GPU进行运算,比如OpenGL或者CUDA.在实际的操作中,往往CUDA实现并行计算会比OpenGL更加方便,而OpenGL在进行后期渲染更具有优势.由于CUDA中的运算结果存储在GPU中,如果将数据download到CPU,然后再将CPU中的数据上传到GPU,使用OpenGL进行渲染,中间的GPU与CPU的交互会很耗时,毕竟使用GPU的目的就是为了加速,这样的数据传输会降低效率. 接下来简要说一下如何使CUDA和OpenGL互操作来实现GPU中数据的交互传输,

快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)

构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, Int]("aa" -> 1, "bb" -> 2) val value2 = Map[String, Int](("aa", 1), ("bb", 2)) 获取映射值: println(if(value2.contain

Android中Fragment和Activity之间的互操作代码例子

摘要 本文介绍了Android中一个Activity中有多个Fragment的情况下,Fragment之间如何通过Activity进行互操作. 源代码 源代码地址为:http://download.csdn.net/detail/logicteamleader/8931199 源代码使用ADT编写,ADT版本为2014,Android版本为android-22. 技术要点 1.在Activity中的多个Fragment之间要互操作,一定要通过此Activity,不能直接通信: 2.在Activi

ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分) 1.A,示例(Sample) 返回顶部 “COM 互操作第二部分”示例 本示例演示了如何将 C# 服务器与 C++ COM 客户端一起使用. 注释 您必须具有管理员权限才能运行此程序,并且必须安装了 Visual C++ 才能编译此示例. 安全说明 提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序

ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分) 1.A,示例(Sample) 返回顶部 “COM 互操作 - 第一部分”示例 本示例演示了 C# 程序如何能够与非托管 COM 组件进行互操作. 安全说明 提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序或网站中使用此代码示例. 对于因将此代码示例用于其他用途而发生的偶然或必然损害,Micr

AnyCAD C++ SDK与OpenCASCADE互操作

AnyCAD SDK有.Net和C++两个版本,使用C++版本的AnyPlatformOcc模块可以实现与OpenCASCADE互操作. C++版本(VS2010 32bit)下载 在AOBridge.h中定义了转换API: namespace AnyCAD { namespace API{   class AnyPlatformOcc_API AOBridge   {   public:      static TopoShape Convert(const TopoDS_Shape& sha

错误 1 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口

http://www.cnblogs.com/waitingfor/archive/2011/12/19/2293469.html 错误 1 无法嵌入互操作类型"Microsoft.Office.Interop.Excel.ApplicationClass".请改用适用的接口,码迷,mamicode.com 错误 1 无法嵌入互操作类型"Microsoft.Office.Interop.Excel.ApplicationClass".请改用适用的接口

ylbtech-LanguageSamples-OfficeSample(COM 互操作)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-OfficeSample(COM 互操作) 1.A,示例(Sample) 返回顶部 本示例演示如何使用称为“COM 互操作”.“省略 ref”.“索引属性”.“命名参数”和“可选参数”的 C# 4.0 功能来创建与 Microsoft Office 进行通信的 C# 应用程序. 传统上,为了访问 Word.Excel 等 Microsoft Office 应用程序,C# 开发人员不得不

Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx

在本系列前面几篇文章中分别介绍了通过WebService.HTTPService.URLLoader以及FielReference等组件或类来完成Flex与.NET服务端的通信的相关知识点.通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案,那便是AMF(ActionScript Message Format)协议.

[转]Go与C语言的互操作

Go有强烈的C背景,除了语法具有继承性外,其设计者以及其设计目标都与C语言有着千丝万缕的联系.在Go与C语言互操作(Interoperability)方面,Go更是提供了强大的支持.尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,这是其他语言所无法望其项背的. 在如下一些场景中,可能会涉及到Go与C的互操作: 1.提升局部代码性能时,用C替换一些Go代码.C之于Go,好比汇编之于C. 2.嫌Go内存GC性能不足,自己手动管理应用内存. 3.实现一些库的Go Wrapper.比如Or