Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。自作Cライブラリ内関数の呼び出し自作のCライブラリ内の関数を呼び出し、文字列を渡す方法について解説します。呼び出し元コード(C#)として「PInvokeExample2.cs」、呼び出し先コード(C)として「pinvoke.c」(「libpinvoke.so」としてビルド)を使用します。ostr;}作業する上でのディレクトリ構造は、下表の通りとします。~/bin(環境変数「PATH」に設定済み)また、~/.profile等で環境変数「LD_LIBRARY_PATH」に自作ライブラリ格納先を設定します。LD_LIBRARY_PATH="$HOME/lib:$LD_LIBRARY_PATH"fi「pinvoke.c」のビルドに次のようなシェルスクリプト「c2so.sh」を使用しました。「~/bin」に保存し、実行権限を与えておきます。PInvokeExample2.cs以下、今回テストしたパターンについて解説します。文字列を渡してみるパターン1は、呼び出し元から呼び出し先へ文字列を渡すだけです。呼び出し元と呼び出し先の対応は以下になります。);呼び出し元で「string」型(参照型)の引数を「値渡し」しているので、方向属性は[In]となり、呼び出し先での引数の内容の変更は行えません(反映されません)。呼び出し先の引数は「char*」でも動作可能ですが、変更不可ということで「const」指定が安全だと思います。方向属性については『方向属性』(msdn)を参照して下さい。呼び出し元でのプロトタイプ宣言をより詳細に記述すると、以下の様になります。testテスト....文字列を渡して、編集された文字列を受け取ってみるパターン2は、呼び出し先で受け取った文字列を編集して引数の内容を変更します。呼び出し元でプロトタイプ宣言したメソッド(関数)の引数の型として「byte[]」を使用しています。);当初、呼び出し元の引数の型として「StringBuilder」型を試してみましたが、呼び出し先で変更した内容が呼び出し元で反映されなかったり、日本語文字列を渡すと呼び出し先に正しく渡らなかったり(文字化け状態での表示)など、なかなかうまくいきません。そこで引数の型として「byte[]」を使用しました。「StringBuilder」型を引数として使用した場合、方向属性は[In/Out]になりますが、「byte」型の配列ではどうなるのか、無指定で問題ないので、[In/Out]ということになりますが、あやふやな場合は[In/Out]指定をしたほうが無難だと思います。iostr);また、パターン3のように、入力と出力で引数を分ける形で「StringBuilder」型を試してみると、問題は発生しませんでした。testテスト....構造体を渡してみるパターン4では、構造体に固定長文字列を組み込む形で、構造体として渡します。);呼び出し元での構造体の定義では、StructLayoutAttribute属性で構造体の各メンバーのメモリ内での配置の制御を、MarshalAsAttribute属性で呼び出し先との対応(固定長文字配列として)を設定しています。呼び出し元の引数にパラメータ修飾子「ref」をつけることで、構造体(値型)の「参照渡し」を行うことになります。この指定により、引数の方向属性は「In/Out」となり、引数の内容の変更が呼び出し先で可能になります。testテスト/19....文字列を渡して、編集された文字列を戻り値として受け取ってみるパターン5では、呼び出し元のプロトタイプ宣言で、戻り値の型として「IntPtr」型を使用しています。呼び出し先で返しているのは、修飾子「static」を付けた文字配列(の先頭アドレス)で、この場合、呼び出し元では「string」型で受け取ることはできません。パターン6では、呼び出し先で動的に割り当てたメモリ領域を「char」型のポインタとして返し、呼び出し元で「IntPtr」型で受け取り、手動で、受け取ったポインタの開放を行っています。パターン6と同じ関数を呼び出して、戻り値を「string」型として受け取ることが可能です(パターン7)。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。12:00法務担当者、6割超が今後業務で「生成AIを使用したい」と回答。新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。