System.Runtime.InteropServices浅见
System.Runtime.InteropServices提供了相应的类或者方法来支持托管/非托管模块间的互相调用。
System.Runtime.InteropServices中几个比较重要的类:
DllImportAttribute : 该类提供对非托管动态链接库进行引用的方法,并告诉我们的编译器该程序的静态入口点是非托管的动态连接库,它的静态属性提供了对非托管动态链接库进行调用所必需的信息,作为最基本的要求,该类应该定义提供调用的非托管动态链接库的名称。成员详细信息
StructLayoutAttribute: 该类使得用户可以控制类或结构的数据字段的物理布局。
public class MySystemTime
{
[FieldOffset(0)]public ushort wYear;
[FieldOffset(2)]public ushort wMonth;
[FieldOffset(4)]public ushort wDayOfWeek;
[FieldOffset(6)]public ushort wDay;
[FieldOffset(8)]public ushort wHour;
[FieldOffset(10)]public ushort wMinute;
[FieldOffset(12)]public ushort wSecond;
[FieldOffset(14)]public ushor wMilliseconds;
}
MarshalAsAttribute : 指示如何在托管代码和非托管代码之间封送数据。下面是MSDN给出的示例代码:
//Applied to a parameter.
public void M1 ([MarshalAs(UnmanagedType.LPWStr)]String msg);
//Applied to a field within a class.
class MsgText {
[MarshalAs(UnmanagedType.LPWStr)] Public String msg;
}
//Applied to a return value.
[return: MarshalAs(UnmanagedType.LPWStr)]
public String GetMessage();
一个将三个类综合运用的实例:调用kernel32.dll中的非托管方法"GetSystemTime"将系统时间返回给定制的类MySystemTime并执行输出.
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace DllImportTest
{
/**//// <summary>
/// 定义一个用于接收非托管API方法返回值的类
/// StructLayout定义了该类的各个成员在物理上的排列方式
/// </summary>
[StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)]
public class MySystemTime
{
[FieldOffset(0)]
public ushort wYear;
[FieldOffset(2)]
public ushort wMonth;
[FieldOffset(4)]
public ushort wDayOfWeek;
[FieldOffset(6)]
public ushort wDay;
[FieldOffset(8)]
public ushort wHour;
[FieldOffset(10)]
public ushort wMinute;
[FieldOffset(12)]
public ushort wSecond;
[FieldOffset(14)]
public ushort wMilliseconds;
}
/**//// <summary>
/// 用LibWrapper的静态方法来调用非托管API方法"GetSystemTime"
/// </summary>
class LibWrapper
{
[DllImport("kernel32.dll", EntryPoint = "GetSystemTime")]
//如果定义的方法名称与要进行封装的非托管API方法不同则需要在DLLImport中指定入口点.
public static extern void gettime([MarshalAs(UnmanagedType.LPStruct)]MySystemTime st);
}
class TestApplication
{
public static void Main()
{
try
{
MySystemTime sysTime = new MySystemTime();
//LibWrapper.GetSystemTime(sysTime);
LibWrapper.gettime(sysTime);
Console.WriteLine("The System time is {0}/{1}/{2} {3}:{4}:{5}", sysTime.wDay,
sysTime.wMonth, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
}
catch (TypeLoadException e)
{
Console.WriteLine("TypeLoadException : " + e.Message);
}
catch (Exception e)
{
Console.WriteLine("Exception : " + e.Message);
}
}
}
}
System.Runtime.InteropServices浅见相关推荐
- 异常:System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid)
异常:System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid) 原因:该引用所需.NET Framework版本为4.5 ...
- C# System.Runtime.InteropServices 相关学习总结
System.Runtime.InteropServices.COMException的解决方法 http://www.jb51.net/article/17629.htm 完美解决"换另一 ...
- 异常详细信息: System.Runtime.InteropServices.COMException: 无效的类别字符串
无效的类别字符串 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Runtime.Inte ...
- System.Runtime.InteropServices.COMException 检索COM类工厂中CLSID{xxxxxxxxx}的组件时失败解决方法...
iis7.5中设定应用程序池中<进程模型>中<标识>为localSystem 提示:System.Runtime.InteropServices.COMException: 命 ...
- System.Runtime.InteropServices.InvalidComObjectException:“COM 对象与其基础 RCW 分开后就不能再使用。”报错解决
System.Runtime.InteropServices.InvalidComObjectException:"COM 对象与其基础 RCW 分开后就不能再使用."报错解决 # ...
- System.Runtime.InteropServices.COMException (0x8004E00F): COM+ 无法与 Microsoft 分布式事务协调程序交谈 (异常来自 HRESU
错误信息: System.Runtime.InteropServices.COMException (0x8004E00F): COM+ 无法与 Microsoft 分布式事务协调程序交谈 (异常来自 ...
- System.Runtime.InteropServices.COMException (0x80040154)错误
用windwos服务.owc.excle组件生成Excel文档,然后通过邮件自动发生给公司管理层,本来在本地测试.配置都正常,但是部署到Window 2003服务器上,服务启动后,日志文件记录程序出错 ...
- System.Runtime.InteropServices.COMException (0x80004005): 无法创建目录或文件
下单员QQ远程求助,百试不得解 调试时出错信息: 自定义工具错误: "代码生成器 'ReportCodeGenerator' 失败.异常堆积 = CrystalDecisions.Share ...
- System.Runtime.InteropServices.COMException
System.Runtime.InteropServices.COMException (0x80040154) 因为EncryptCom.dll 没有注册 解决办法:注册EncryptCom.dll ...
最新文章
- 原来,程序的世界远比我想象的精彩
- h5怎么加入php代码,HTML5主要新增标签的使用代码分享
- 中科院合肥科学技术学校05计算机,硕士研究生课程设置-中国科学院合肥物质科学研究院.PDF...
- richTextBoxFontClass
- Linux操作系统下Sudo命令的使用方法说明
- uds帧格式_如何看懂UDS诊断报文
- 鼠标点击时隐藏java代码,js实现点击展开隐藏效果(实例代码)
- Mac备忘录笔记教学——强大的内置笔记软件
- python处理json数据 乱码报错_python json.loads json.dumps(ensure_ascii = False) 汉字乱码问题解决...
- jQuery源码研究分析学习笔记-回调函数(11)
- node-glob学习
- 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴
- R Markdown 简介
- python 24点题目分析_24点游戏的递归解法和Python实现
- 苹果MacBook Pro笔记本使用U盘重装win10系统教程
- 免费MindManager2021最新版本地址win/mac思维导图工具 新增功能
- vue表格某一列的显示与隐藏
- chai断言库学习-API(expect部分)
- python count函数代码_python中count函数简单用法
- html5 swf在线播放,html5怎样播放swf格式的视频
热门文章
- 信息学奥赛一本通 2073:【例2.16 】三角形面积
- 种树(信息学奥赛一本通-T1423)
- 信息学奥赛C++语言:某年某月天数
- 信息学奥赛一本通C++语言——1046:判断一个数能否同时被3和5整除
- linux vi刷新页面,vim的神级配置 - bubifengyun的个人页面 - OSCHINA - 中文开源技术交流社区...
- C语言 strlen函数实现
- mave工程中的一个类调用另一个聚合工程的一个类_求求你,别再写上千行的类了好吗...
- java 获取web目录结构_Intellij Idea Javaweb 目录结构及获取项目内资源
- 机器学习--弹性网络(Elastic-Net Regression)
- MySQL:too many connections