C++/CLI .NET環境でのネイティブコードの利用について

C# VB.NETなどの.Net環境から、
C,C++等で作られたネイティブの資産を利用するには
大きく分けて2つの方法があります。

  • ネイティブ環境用につくられたDLLファイルを通して、
    ネイティブの関数を直接呼び出す方法(P/Invoke)。
  • マネージ、アンマネージ両方を同時に扱える言語C++/CLIを用いて、
    内側はアンマネージドで処理し、外側からはマネージドに見えるような
    ラッパーライブラリを作る方法。

双方の特徴を思いつく範囲で上げて見ました。

P/Invoke(DLLImport)

  • このDLLの形で公開されているライブラリは多く、
    この方法で呼び出しているラッパーライブラリが公開されている場合も多い
  • ヘッダファイルの内容(関数のプロトタイプ宣言、構造体の宣言)を.NET 風に書き直す必要がある。
  • マネージドコードから、直接ネイティブ関数を呼び出すので
    マネージド型とアンマネージド型で直接やり取りを行う。
    アンマネージド関数に、マネージドオブジェクトを渡すことになり、
    呼び出しコスト、及び、オブジェクトの変換コストが掛かる。
  • 関数の宣言や、オブジェクトの変換規則(マーシャリング)を覚える必要がある
  • 関数の種類によってはメモリ破壊などが発生する可能性がある。
  • クラス(非staticなメンバ関数)が使えない
  • DLL自体の修正は難しいが、適応は楽

C++/CLI

  • C++/CLIに関する知識、最適なラップ方法に関する知識が必要
  • 作成後はVisualStudioで参照に追加するだけ使える。
  • 外側からは普通のマネージドオブジェクトに見え、
  • 実際のやり取りはアンマネージドオブジェクトどうしで行うためコストが少ない。

  • 適切にラップすればどんな関数でも正常に使用可能
  • クラス(非staticなメンバ関数)が使える。
  • ネイティブ資産全体を.Net環境で使えるようにしようとすると、
    すべてのクラス、すべての関数をラップする必要がある
  • P/Invokeでは、実行時コストが大きく、マネージ、アンマネージ間で直接やり取りを行うが故の制限なども多いため
    .NETからネイティブコードを呼びだすためのライブラリを新たに作る必要がある場合は
    C++/CLIをお勧めします。

    広告

    akatukisiden について

    フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
    カテゴリー: C++/CLI, 相互運用 パーマリンク

    C++/CLI .NET環境でのネイティブコードの利用について への1件のフィードバック

    1. akatukisiden より:

      COMでもネイティブコードが使えることに気づいた
      COMは正直よく知らないので省略
      Office関連やWinRTで使われてるらしい。

    コメントを残す

    以下に詳細を記入するか、アイコンをクリックしてログインしてください。

    WordPress.com ロゴ

    WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

    Twitter 画像

    Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

    Facebook の写真

    Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

    Google+ フォト

    Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

    %s と連携中