P /呼び出しとリバースP /呼び出し



P Invoke Reverse P Invoke



.Net DLL、COMコンポーネントとの関係は次のとおりです。

相互運用



1. P / Invoke

P / Invoke(プラットフォーム呼び出し)は、比較的軽量な方法の.NET呼び出しネイティブコード(ネイティブコード)です。ネイティブコードをダイナミックリンクライブラリに記述し、次に外部静的関数宣言で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 in user32.dll is a function has been achieved here need only declare what it is, then you can call

2.リバースP /呼び出し

次に、ネイティブコードで.NETメソッドを呼び出す方法を見てみましょう。ネイティブコードは、.NETデリゲート(デリゲート)を取得してから、使用するデリゲートとして関数ポインターを取得する必要があります。次に例を示します。

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管理関数を呼び出してダイアログボックスを表示できるようにする必要があります。ネイティブコードがこの関数を呼び出すことができるようにするために、そのステートメントに従って、デリゲートを設定し、P / Invokeを介してこの委員会に渡されたネイティブコードを呼び出します。ネイティブコードは、次のようにマネージコードを呼び出すことができます。



#include
#include

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から引用されたソーステキスト