zoukankan      html  css  js  c++  java
  • C# 调用非托管程序 [转]

    C#调用非托管程序有多种方式,这里整理一下。

    本篇示例代码大都来自博客并注明出处网址,特此声明。
    COM调用
    COM应该是非托管组件重用最重要的方式,特别是调用微软的COM组件。
    可以用VS添加引用的方式自动生成包装类,也可以用Tlbimp.exe实用工具包装COM对象生成包装类。
    示例:调用oleprn 1.0 Type Library获取打印机状态,该COM对象是在"c:\Windows\System32\oleprn.dll"中实现的。
    代码来源(http://blog.crowe.co.nz/archive/2005/08/08/182.aspx)

    COM对象需要在本机注册,这个程序部署带来一定的麻烦,如果调用简单的功能,包装COM有点大材小用。
    如果只简单的调用非托管函数,可以用接下来介绍的DllImprot等方式。

    DllImport
    DllImport是在"System.Runtime.InteropServices"命名空间中定义的特性。
    示例:调用windows对话框。
    [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "MessageBox")]
    public static extern int InvokeMessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        InvokeMessageBox(
    new IntPtr(0), "对话框内容", "对话框标题", 0);
    }

    加载非托管动态链接库

    Win32中,有个LoadLibrary(string file)函数,加载动态链接库;GetProcAddress函数动态调用导出函数。
    .NET类库的 Marshal.GetDelegateForFunctionPointer 方法能将非托管函数指针转换为委托。
    因此可以实现非托管程序的调用。代码来源:(http://www.cnblogs.com/rick/archive/2006/07/13/apicall.html)

    直接调用执行机器码

    机器码是最原始的程序代码,或称指令,把这些指令装载到内存,Marshal.GetDelegateForFunctionPointer方法转换为对应的委托,调用即可。
    示例:代码来源(http://space.itpub.net/100788/viewspace-265042)
  • 相关阅读:
    数据库迁移至ASM
    获取数据库或SHEME的DDL语句
    membership配置数据库(SQL2000)
    DIV+CSS到底是什么?
    如何更改表的所有者权限
    windows server 2003 上“您要访问的网页有问题,无法显示。HTTP 500 内部服务器错误。”的问题解决方案!
    瞎忙
    瞎忙
    如何更改表的所有者权限
    DIV+CSS到底是什么?
  • 原文地址:https://www.cnblogs.com/gxlinhai/p/1337363.html
Copyright © 2011-2022 走看看