Open棟梁Project - マイクロソフト系技術情報 Wiki
目次  †
概要  †
まずは「マーシャリング」を参照して下さい。
基本が解ればなんとかなると思います。
方法  †
アンマネージドコードのインターフェイスをマネージドコード(.NET)に公開する方法  †
以下の2つの方法があります。
- DLLのインターフェイスをマネージドコード(.NET)に公開する方法。
 
- COMのインターフェイスをマネージドコード(.NET)に公開する方法。
 
マネージドコード(.NET)のインターフェイスをアンマネージドコードに公開する方法  †
以下の2つの方法があります。
- .NETのアンマネージド拡張(C++/CLI)でDLLインターフェイスをDLLユーザに公開する方法と
 
- .NETアセンブリでCOMインターフェイスをCOMユーザに公開する方法があります。
 
サンプルコード  †
コチラが参考になります。
OpenTouryoProject-SampleProgram
.NET(manage)⇔VC、VB6(unmanage)の相互運用  †
Other-InteropWithUnmanage? at master
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Other/InteropWithUnmanage
.NET(manage)⇔VC、VB6(unmanage)の相互運用のテストです。
アンマネージコードからマネージコードを呼び出す  †
上記の逆を行なう相互運用。
Other-DotNETBridge at master
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Other/DotNETBridge
Win32 DLL と C++/CLIのブリッジDLLを使用して、アンマネージコードからマネージコードを呼び出す。
事例  †
C/C++側のコールバック関数を.NETから呼び出したい  †
マーシャリングの動作のイメージができていないと、正しい処理を実装できない可能性があります。
e.g.: 以前、callback実装を正しく実装できないことがあった。
質問  †
- C++のEXEからC#のメソッドを呼び出します。
 
- このときの引数でC++側のコールバック関数のアドレスを渡します。
 
- このあと、外的要因でC#のDLLから上記のコールバックを呼び出そうとしていますが、
コールバック呼び出しで例外エラーとなります。 
回答  †
- C++からC#は直接呼べないのでアンマネージド拡張(C++/CLI)でDLLのエクスポート関数経由で.NETに接続する必要があると思います。
 
- また、.NETにCの関数ポインタを直接渡しても.NETからの呼び出しはできないので、C++/CLI経由にする必要があると思います。
 
そこで思いついたのは、
- C++/CLI内部でコールバックするメソッドを持ったオブジェクトを作成し、
C#のメソッド経由でそのオブジェクトを渡す。
C#からこのオブジェクトのメソッドを経由してC++にコールバックする。 
- C++/CLIでC#から呼ぶためのDLLエクスポート関数を作る。
このエクスポート関数にCの関数ポインタを渡してコールバックする。 
という2つの方法です。
逆(.NETのコールバック関数をC/C++から呼び出したい)は
標準の相互運用マーシャラーでサポートされるようです。
恐らく、自動的にマーシャリングされるのだと思います。
- 行きはマーシャリング(デリゲードからポインタ)
 
- 帰りもマーシャリング(多分Cにラッパのポインタが渡る)
 
結果  †
上記の1.で解決しました。
参考  †
MSDN  †
その他  †
ツール類  †
- Win32APIViewer .NET
リンク切れ?