.Net与动态链接库、COM组件的关系大致如下:
1. P/Invoke
P/Invoke(platform invoke)是.NET调用本地代码(native
code)的一种比较轻便的方式。只需要将本地代码编写成动态链接库,然后在c#代码中,声明一个外部静态函数,并且用DllImport属性指明动态连接库的入口。举例如下:
using
System;
using
System.Runtime.InteropServices;
class
PInvoke
{
[DllImportAttribute("user32.dll"
, EntryPoint = "MessageBoxW"
)]
public
static
extern
int
MessageBoxW(
[In]System.IntPtr hWnd,
[In][MarshalAs(UnmanagedType.LPWStr)] string
lpText,
[In][MarshalAs(UnmanagedType.LPWStr)] string
lpCaption,
uint
uType);
public
static
void
Main()
{
MessageBoxW(IntPtr.Zero, "Hello"
, "Interop"
, 0);
}
}
MessageBoxW是一个在user32.dll中已经实现了的函数,这里只需要声明一下它,然后就可以调用了
2. Reverse P/Invoke
接着,我们来看看在本地代码中调用.NET方法。本地代码需要拿到一个.NET委托(delegate),然后把这个delegate当作一个函数指针使用,示例如下:
using
System;
using
System.Windows.Forms;
using
System.Runtime.InteropServices;
public
class
Program
{
internal
delegate
void
DelegateMessageBox([MarshalAs(UnmanagedType.LPWStr)]string
msg);
[DllImport("Native.dll"
, CallingConvention = CallingConvention.Cdecl)]
static
extern
void
NativeMethod(DelegateMessageBox d);
public
static
void
ShowMessageBox(string
msg)
{
MessageBox.Show(msg);
}
public
static
void
Main()
{
NativeMethod(new
DelegateMessageBox(ShowMessageBox));
}
}
这个例子中,我们希望本地代码能够调用托管函数ShowMessageBox来显示一个对话框。为了让本地代码可以调用这个函数,我们根据它的声明,定了了一个delegate,并且通过P/Invoke把这个委托传给了本地代码。本地代码可以如下调用托管代码:
#include
<stdio.h>
#include
<wtypes.h>
extern
"C"
{
__declspec
(dllexport
) void
NativeMethod(void
(__stdcall
*pShowMsgBox)(WCHAR *wChar))
{
(*pShowMsgBox)(L"hello reverse interop"
);
}
}
注意到托管代码中的委托到了本地代码中,就是一个函数指针,本地代码可以像一个普通的函数指针一般调用托管代码。
——源文引自http://blogs.msdn.com/silverlightshanghai/archive/2009/03/29/net-interop-p-invoke-reverse-p-invoke.aspx
分享到:
相关推荐
P/Invoke Interop Assistant,它支持托管代码和非托管代码之间的方法签名的转换,而且直接生成相关的C#或者是VB的方法调用代码。这个签名的转换,不只是适用于Windows的方法签名,只要给定一个C头文件,就可以转换...
《精通.NET互操作P/Invoke,C++Interop和COM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互操作方法、属性以及各种工具的用法及其工作原理。《精通.NET互操作...
可以把C/C++中的数据类型、结构体数据格式转换为C#或者VB版本中的对应格式类型。很方便
P/Invoke Interop Assistant,用来调试C++写的动态库转换成C#或VB.NET
《精通.NET互操作:p/invoke, c++ interop和COM interop》一书的源代码
《CLR via C#》非托管代码互操作性提到的P/Invoke Interop Assistant开发工具,包含源代码,是从网站:http://clrinterop.codeplex.com/ 上下载的,作为备份
利用P/Invoke获取更改后的系统CultureInfo
C#串口操作小例子,P/Invoke 调用...........
在.NET环境下编写与RS252串口通信的应用程序的唯一方法,就是引用过时了的并且有点限制的MSComm ActiveX控件。这篇文章介绍了用C#安全代码编写一个多线程的...这个文章还探讨了一些用C#和Visual Basic .NET写的示例程序
《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》 因为此书太大,所以分为7部分下载;每部分可单独使用,为RAR压缩文件解压后为PDF版。因为第二部分和第六部分太大以后有权限了上传。 共分为:七部分 当前是:...
J/Invoke enables Java developers to easily invoke native methods (such as the Win32 API or C-based Windows DLLs and Unix dynamic libraries) with pure Java code. Unlike error-prone JNI programming ...
Ivoke-WCMDump 什么是Credential Manager...powershell.exe "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/peewpw/Invoke-WCMDump/master/Invoke-WCMDump.ps1');Invoke-WCMDump
托管代码与非托管代码互操作的辅助产生代码的工具
源生成器,用于将用户定义的Win32 P / Invoke方法集和支持类型添加到C#项目中。 C#/ Win32 P / Invoke源生成器一个源生成器,用于将用户定义的Win32 P / Invoke方法集和支持类型添加到C#项目中。 功能快速向您的...
JNA的功能和P/Invoke类似,但编写方法与P/Invoke截然不同。JNA没有使用Annotation, 而是通过编写一般的Java代码来实现。 P/Invoke是.NET平台的机制。而JNA是Java平台上的一个开源类库,和其他类库没有什么区别
为了能用上原来的C++代码,只好研究下从C# 中调用DLL 首先必须要有一个声明,使用的是DllImport关键字: 包含DllImport所在的名字空间 using System.Runtime.InteropServices; public class XXXX{ ...
http://blog.csdn.net/jasonliao909/article/details/50602528
副标题: P/Invoke,C++ Interop和COM Interop 作者: 黄际洲 / 崔晓源 出版社: 人民邮电出版社 出版年: 2009-5 页数: 419 定价: 68.00元 装帧: 平装 ISBN: 9787115204349 内容简介 · · · · · · ...