飘遥的Blog

C/C++/.NET
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C# 调用非托管程序

Posted on 2008-09-13 18:31  Zzx飘遥  阅读(1943)  评论(1编辑  收藏  举报
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)