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)
  • 相关阅读:
    MTK 定时器 休眠时的动作
    Troubleshooting MySQL Memory Usage
    disruptor
    Google Protocol Buffer 的使用和原理
    百度贴吧10亿量级LAMP架构分享
    nginx 不带www到www域名的重定向
    配置电信网通双线双IP的解决办法
    Create a W3C validated anchor link with target=“_blank”
    Could not update ICEauthority file /home/username/.ICEauthority
    Can't load IA 32bit .dll on a AMD 64bit platform
  • 原文地址:https://www.cnblogs.com/gxlinhai/p/1337363.html
Copyright © 2011-2022 走看看