System.Runtime.InteropServices提供了相应的类或者方法来支持托管/非托管模块间的互相调用。
System.Runtime.InteropServices中几个比较重要的类:
DllImportAttribute : 该类提供对非托管动态链接库进行引用的方法,并告诉我们的编译器该程序的静态入口点是非托管的动态连接库,它的静态属性提供了对非托管动态链接库进行调用所必需的信息,作为最基本的要求,该类应该定义提供调用的非托管动态链接库的名称。成员详细信息
StructLayoutAttribute: 该类使得用户可以控制类或结构的数据字段的物理布局。

[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 ushor wMilliseconds; 
}

MarshalAsAttribute : 指示如何在托管代码和非托管代码之间封送数据。下面是MSDN给出的示例代码:

[C#] 
//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;
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浅见相关推荐

  1. 异常:System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid)

    异常:System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid) 原因:该引用所需.NET Framework版本为4.5 ...

  2. C# System.Runtime.InteropServices 相关学习总结

    System.Runtime.InteropServices.COMException的解决方法 http://www.jb51.net/article/17629.htm 完美解决"换另一 ...

  3. 异常详细信息: System.Runtime.InteropServices.COMException: 无效的类别字符串

    无效的类别字符串 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Runtime.Inte ...

  4. System.Runtime.InteropServices.COMException 检索COM类工厂中CLSID{xxxxxxxxx}的组件时失败解决方法...

    iis7.5中设定应用程序池中<进程模型>中<标识>为localSystem 提示:System.Runtime.InteropServices.COMException: 命 ...

  5. System.Runtime.InteropServices.InvalidComObjectException:“COM 对象与其基础 RCW 分开后就不能再使用。”报错解决

    System.Runtime.InteropServices.InvalidComObjectException:"COM 对象与其基础 RCW 分开后就不能再使用."报错解决 # ...

  6. System.Runtime.InteropServices.COMException (0x8004E00F): COM+ 无法与 Microsoft 分布式事务协调程序交谈 (异常来自 HRESU

    错误信息: System.Runtime.InteropServices.COMException (0x8004E00F): COM+ 无法与 Microsoft 分布式事务协调程序交谈 (异常来自 ...

  7. System.Runtime.InteropServices.COMException (0x80040154)错误

    用windwos服务.owc.excle组件生成Excel文档,然后通过邮件自动发生给公司管理层,本来在本地测试.配置都正常,但是部署到Window 2003服务器上,服务启动后,日志文件记录程序出错 ...

  8. System.Runtime.InteropServices.COMException (0x80004005): 无法创建目录或文件

    下单员QQ远程求助,百试不得解 调试时出错信息: 自定义工具错误: "代码生成器 'ReportCodeGenerator' 失败.异常堆积 = CrystalDecisions.Share ...

  9. System.Runtime.InteropServices.COMException

    System.Runtime.InteropServices.COMException (0x80040154) 因为EncryptCom.dll 没有注册 解决办法:注册EncryptCom.dll ...

最新文章

  1. 原来,程序的世界远比我想象的精彩
  2. h5怎么加入php代码,HTML5主要新增标签的使用代码分享
  3. 中科院合肥科学技术学校05计算机,硕士研究生课程设置-中国科学院合肥物质科学研究院.PDF...
  4. richTextBoxFontClass
  5. Linux操作系统下Sudo命令的使用方法说明
  6. uds帧格式_如何看懂UDS诊断报文
  7. 鼠标点击时隐藏java代码,js实现点击展开隐藏效果(实例代码)
  8. Mac备忘录笔记教学——强大的内置笔记软件
  9. python处理json数据 乱码报错_python json.loads json.dumps(ensure_ascii = False) 汉字乱码问题解决...
  10. jQuery源码研究分析学习笔记-回调函数(11)
  11. node-glob学习
  12. 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴
  13. R Markdown 简介
  14. python 24点题目分析_24点游戏的递归解法和Python实现
  15. 苹果MacBook Pro笔记本使用U盘重装win10系统教程
  16. 免费MindManager2021最新版本地址win/mac思维导图工具 新增功能
  17. vue表格某一列的显示与隐藏
  18. chai断言库学习-API(expect部分)
  19. python count函数代码_python中count函数简单用法
  20. html5 swf在线播放,html5怎样播放swf格式的视频

热门文章

  1. 信息学奥赛一本通 2073:【例2.16 】三角形面积
  2. 种树(信息学奥赛一本通-T1423)
  3. 信息学奥赛C++语言:某年某月天数
  4. 信息学奥赛一本通C++语言——1046:判断一个数能否同时被3和5整除
  5. linux vi刷新页面,vim的神级配置 - bubifengyun的个人页面 - OSCHINA - 中文开源技术交流社区...
  6. C语言 strlen函数实现
  7. mave工程中的一个类调用另一个聚合工程的一个类_求求你,别再写上千行的类了好吗...
  8. java 获取web目录结构_Intellij Idea Javaweb 目录结构及获取项目内资源
  9. 机器学习--弹性网络(Elastic-Net Regression)
  10. MySQL:too many connections