[C#]I/O完成端口的实现

简介:
VC++ 中我几乎每一个 Windows Service 都是采用 I/O 完成端口。至于在 C# 中如何使用 I/O 完成端口,一直很少见人提及。  William Kennedy 的三篇文章《 IOCP Thread Pooling in C# 》,对实现这种机制很有帮助,唯一美中不足的是,它只能把 int 数值压入完成端口,而无法像 VC++ 中那样可以将接口指针 /BSTR 字符串等等转为 OVERLAPPED* 。我试了很多遍Marshal.PtrToStructure/StructureToPtr 和StringToBSTR,总是无法成功通过I/O完成端口传递string。 

我还曾经用以下这2个函数将string转换为byte[],然后将byte[]转换为NativeOverlapped。总是不行。 

System.Threading.NativeOverlapped Ov = new NativeOverlapped(); 
byte[] btRaw = Str2Arr(strValue); 
Ov = (System.Threading.NativeOverlapped) 
RawDeserialize(btRaw, typeof(System.Threading.NativeOverlapped)); 

函数声明如下: 
public static byte[] Str2Arr(String s) 

return (new UnicodeEncoding()).GetBytes(s); 

public static string Arr2Str(byte[] buffer) 

return (new UnicodeEncoding()).GetString(buffer, 0, buffer.Length); 

public static byte[] RawSerialize( object anything ) 

int rawsize = Marshal.SizeOf( anything ); 
IntPtr buffer = Marshal.AllocHGlobal( rawsize ); 
Marshal.StructureToPtr( anything, buffer, false ); 
byte[] rawdatas = new byte[ rawsize ]; 
Marshal.Copy( buffer, rawdatas, 0, rawsize ); 
Marshal.FreeHGlobal( buffer ); 
return rawdatas; 


public static object RawDeserialize( byte[] rawdatas, Type anytype ) 

int rawsize = Marshal.SizeOf( anytype ); 
if( rawsize > rawdatas.Length ) 
return null; 
IntPtr buffer = Marshal.AllocHGlobal( rawsize ); 
Marshal.Copy( rawdatas, 0, buffer, rawsize ); 
object retobj = Marshal.PtrToStructure( buffer, anytype ); 
Marshal.FreeHGlobal( buffer ); 
return retobj; 
}
目录
相关文章
|
23天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
40 6
|
4月前
|
编译器 API C语言
C语言与硬件交互:通过I/O端口控制硬件。
C语言与硬件交互:通过I/O端口控制硬件。
164 0
|
存储 安全 编译器
C#中使用I/O文件流
流,即是二进制数值,文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。在 .NET 中,System.IO命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串行端口启用通信的类型。命名空间:System.IO程序集:System.Runtime.dll。
102 1
msp430 I/O端口中断实验
单片机的P1.0引脚连接一个LED灯, P1.1引脚连接一个开关。要求 编写程序,利用中断方法检测P1.1引脚处的开关是否被按下。每按一下开关,P1.0连接的LED 亮灭状态就变换一次。
149 0
msp430 I/O端口中断实验
|
消息中间件 API Windows
|
关系型数据库 C# 分布式数据库
|
安全 芯片 Windows
34、I/O端口操作
    I/O端口操作在Windows操作系统中属于特权命令,必须在内核模式下运行。在DOS中,I/O端口操作主要通过IN/OUT指令来进行。  一、I/O端口操作实现  1、DDK实现I/O端口操作 READ_PORT_UCHAR The READ_PORT_UCHAR macro reads a byte from the specified port address。
1052 0
|
存储 C# 数据库
C#笔记28:I/O操作
C#笔记28:I/O操作 本章概要: 1:基本文件I/O    1.1:用于文件 I/O 的类    1.2:用于从流读取和写入流的类    1.3:通用 I/O 流类 2:通用I/O任务 3:独立存储     3.1:为什么要使用独立存储    3.2:使用独立存储        以下的区别有助于澄清文件和流的差异。
757 0