「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
方法 †
アンマネージドコードのインターフェイスをマネージドコード(.NET)から使用する方法 †
以下の2つの方法があります。
DLLのインターフェイスをマネージドコード(.NET)から使用する方法。 †
※ サンプルコード、参考を参照。
COMのインターフェイスをマネージドコード(.NET)から使用する方法。 †
※ サンプルコード、参考を参照。
マネージドコード(.NET)のインターフェイスをアンマネージドコードに公開する方法 †
以下の2つの方法があります。
.NETのアンマネージド拡張(C++/CLI)でDLLインターフェイスをDLLユーザに公開する方法。 †
※ サンプルコード、参考を参照。
.NETアセンブリでCOMインターフェイスをCOMユーザに公開する方法。 †
※ 参考を参照。
サンプルコード †
コチラが参考になります。
.NET(manage)→ VC、VB6(unmanage)の相互運用 †
.NET(manage)→ VC、VB6(unmanage)の相互運用のテストです。
アンマネージコードからマネージコードを呼び出す †
上記の逆(VC、VB6(unmanage)→ .NET(manage))を行なう相互運用。
事例 †
.NET側のコールバック関数をC/C++から呼び出したい †
- P/Invoke(相互運用マーシャラー)に標準実装されている模様。
- 恐らく、自動的にマーシャリングされるのだと思います。
- 行きはマーシャリング(デリゲードからポインタ)
- 帰りもマーシャリング(多分Cにラッパのポインタが渡る)
※ 参考を参照。
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つの方法です。
結果 †
上記の1.で解決しました。
参考 †
microsoft.com †
Microsoft Docs †
MSDN(旧) †
その他 †
@IT †
P/Invoke †
ツール類 †
- Win32APIViewer .NET
リンク切れ?
Tags: :Windows, :プログラミング, :.NET開発