関連記事
- 今週もひたすらモノ書き #JAVA 祭りがまだまだ続く そろそろC#を書かせろー 【2024年12月04日(水)】
- 【#CSHARP】ソリューション内でサービス,Winformアプリを混在で作成させ,バイナリ出力先を同じにするとサービスが起動しない 【2024年02月08日(木)】
- 【#PHP】謎な #Laravel 案件 引き渡したじ 【2024年01月11日(木)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- Javaの”やらかし”でC#と人気逆転か 激変プログラミング言語人気ランキング 【2023年10月18日(水)】
また,C#内のfloat配列をドカンと
アンマネージDLLに渡す必要が出てきて
もちろん,C#内のすべてのオブジェクトは,マネージ管理
ガーベジコレクションが勝手気ままに,オブジェクトのアドレスを,変えてくれまする
これじゃぁ~,アンマネージDLL側は安心して,データの受取ができない...
ってことで,まず思いついたのが
Marshal.AllocCoTaskMem()を使用して,固定アドレスなバッファを作成して,こいつに配列の中身を全コピーの上で
アンマネージDLLを呼び出しちゃえ!ってやつ
ソースはこちら
[DllImport("hogehoge.dll")] private static extern int dll_TestFunc(int frameno, IntPtr ary, int aryCount); public int TestFunc(int frameno, ref float[] ary) { int len = ary.Length; IntPtr p = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(float)) * len); Marshal.Copy(ary, 0, p, len); int re = dll_TestFunc(frameno, p, len); Marshal.FreeCoTaskMem(p); return re; }でも,これだと,メモリリソース倍必要だし
コピーのオーバーヘッドも,ちと嫌な感じだし?
配列から直接IntPtr(しかも,マネージメモリ管理から外れるように,fixedしてくれないとまずい)
取り出せないのかねぇ~?
だったんですが,
GCHandle構造体
を使えば良いそうな.
ハンドルを取得するときに,ピン止め(GCHandleType.Pinned)するのがミソ
これで,マネージメモリ管理から外れまする
ソースはこちら
[DllImport("hogehoge.dll")] private static extern int dll_TestFunc(int frameno, IntPtr ary, int aryCount); public int TestFunc(int frameno, ref float[] ary) { int len = ary.Length; GCHandle gcH = GCHandle.Alloc(ary, GCHandleType.Pinned); int re = dll_TestFunc(frameno, gcH.AddrOfPinnedObject(), len); gcH.Free(); return re; }これで,だいぶすっきりしましたわん 😉
コメント
【#閃輝暗点】閃輝暗点が始まった!いつもどおり目が見えなくなってるー(汗
【#イプシロン】イプシロンSロケット 燃焼試験中に爆発事故発生
あっちもこっちも風邪が流行ってるの.外に出たら感染する勢い!
【訃報】俳優 火野正平さん死去 75歳
【地震】日向灘でM4.4の地震
【#第三次世界大戦】ウクライナ空軍 “ICBM1発がロシア南部から発射された”
司法省 “グーグルはクローム売却を” 裁判所に要求へ 米報道
最近,仕事がずっと激しい...ドロドロドロ
今日は謎の宴会らしい...スーツが入るのかっ!?(GRB爆
「侍ジャパン」宮崎県入り 「プレミア12」向け きょうから合宿