関連記事
- 【#CSharp】C#が2025年「プログラミング言語オブ・ザ・イヤー」獲得 【2026年01月16日(金)】
- なんと!今週の土曜日も仕事してますた.来週の土曜日も仕事臭い.TCPソケット通信をゴリゴリ書いてる 【2025年08月30日(土)】
- 【ChatGPT o4】祝日なのに仕事ーバテすぎー今夜こそ絶命だーモルモルモル 【2025年03月20日(木)】
- 【#CSharp】制御系が動き出したべ 【2025年02月20日(木)】
- 【#CSharp】ひっさしぶりにガッツリなC#案件をやっているぞー 【2025年02月19日(水)】
また,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;
}
これで,だいぶすっきりしましたわん 😉 
コメント
【桜】毎年恒例,国富の一本桜を見物に
【#パイナップル】パイナップル様をベランダへ移動させたべ
明日は天気が悪くなるの.花芽が大きくなるような降雨かの?
宮崎交通 路線バス 4月から大幅減便 運転士不足で(26/3/14)
JR大阪駅近くの工事現場 下水道の管が地上部分にせり出したか
雷が鳴ってる!今年初の雷キター
【#イラン戦争】イラン最高指導者ハメネイ師が死亡 トランプ大統領 SNSに投稿
土砂降りじゃー 春の雨が降りまくってる
今週は天気が悪いっぽい.ようやっと雨が定期的に降りだした