関連記事
- 【#PostgreSQL】テーブルから取得したレコードセットをCSVへ落とそうとすると,空ファイルが出来る...ドロドロドロ 【2023年03月08日(水)】
- 【#git】TortiseGit ver2.14のGitWCRev.exeを動かすとErrorCD:10を出力して,動かない 【2023年02月08日(水)】
- 【#Excel】Excel-COMを叩くアプリの改造,オワタ 【2023年01月18日(水)】
- 【#CSHARP】System.Numerics.Vectorでグリングリン,AVXレジスタをぶん回したい 【2023年01月14日(土)】
- 【#PostgreSQL】鬼のような4本のSQLを書き上げた 【2023年01月13日(金)】
また,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; }これで,だいぶすっきりしましたわん 😉
コメント
【#WBC2023】村上の逆転サヨナラ打で3大会ぶりの決勝進出
【#桜】宮崎~国富:大坪の一本桜にて春を満喫してきた(23/3/18)
【速報】ガーシー前議員「引っ越しする」 警視庁が逮捕状請求
今日は東日本大震災12年(23/3/11)
【#WBC2023】1次ラウンド 日本 8-1 中国 大谷翔平さんが凄かった
【#電気代】23年2月分の電気代,安すぎワロタ Ryzen7 7700xに変えてから目に見えて電気使用量が減ってる件
【H3】初号機 今月6日に改めて打ち上げの方向で調整 JAXA(23/3/3)
【#WBC2023】大谷翔平『小型飛行機』で名古屋入り