マイクロソフト系技術情報 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))を行なう相互運用。

事例

C/C++側のコールバック関数を.NETから呼び出したい

マーシャリングの動作のイメージができていないと、正しい処理を実装できない可能性があります。
e.g.: 以前、callback実装を正しく実装できないことがあった。

質問

  • C++のEXEからC#のメソッドを呼び出します。
  • このときの引数でC++側のコールバック関数のアドレスを渡します。
  • このあと、外的要因でC#のDLLから上記のコールバックを呼び出そうとしていますが、
    コールバック呼び出しで例外エラーとなります。

回答

  • C++からC#は直接呼べないのでアンマネージド拡張(C++/CLI)でDLLのエクスポート関数経由で.NETに接続する必要があると思います。
  • また、.NETにCの関数ポインタを直接渡しても.NETからの呼び出しはできないので、C++/CLI経由にする必要があると思います。

そこで思いついたのは、

  1. C++/CLI内部でコールバックするメソッドを持ったオブジェクトを作成し、
    C#のメソッド経由でそのオブジェクトを渡す。
    C#からこのオブジェクトのメソッドを経由してC++にコールバックする。
  2. C++/CLIでC#から呼ぶためのDLLエクスポート関数を作る。
    このエクスポート関数にCの関数ポインタを渡してコールバックする。

という2つの方法です。

逆(.NETのコールバック関数をC/C++から呼び出したい)は
標準の相互運用マーシャラーでサポートされるようです。

恐らく、自動的にマーシャリングされるのだと思います。

  • 行きはマーシャリング(デリゲードからポインタ)
  • 帰りもマーシャリング(多分Cにラッパのポインタが渡る)

結果

上記の1.で解決しました。

参考

MSDN

  • アンマネージ コードとの相互運用
    http://msdn.microsoft.com/ja-jp/library/sd10k43k.aspx
    • アンマネージ コードとの相互運用性に関する方法
    • .NET Framework への COM コンポーネントの公開
    • COM への .NET Framework コンポーネントの公開
    • アンマネージ DLL 関数の処理
    • 相互運用のためのデザインの考慮事項
    • 相互運用マーシャリング
    • 方法: HRESULT に例外を割り当てる
    • ジェネリック型を使用する相互運用

その他

@IT

P/Invoke

ツール類

  • Win32APIViewer .NET
    リンク切れ?

Tags: :Windows, :プログラミング, :.NET開発


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-03 (土) 13:03:53 (560d)