|
■No3614 (Hongliang さん) に返信 > 構造体の数が少ないのなら、オーバーロードで済ませた方が楽かも。 > [DllImport("DLLTest.dll")] > static extern int test3(out StructA p, int n); > [DllImport("DLLTest.dll")] > static extern int test3(out StructB p, int n); > > 構造体にプリミティブな値型しか含まれないなら、GCHandle.Alloc で GCHandleType.Pinned すれば手軽かも。 > unsafe ありなら fixed でも。
なるほど!!そういう事ができるんですね。φ(..)メモメモ Blue の方法もあることを覚えておきます。
C#をはじめて間もないのでわからないことがたくさん有りますが、このような掲示板の存在と回答していただける方々に感謝いたします。 どうもありがとうございました。
最後に解決したソースを公開しておきます。
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;
namespace CStest { class Program { [DllImport("DLLTest.dll")] static extern int test3(IntPtr p, int n); [DllImport("DLLTest.dll")] static extern int test3(ref structA p, int n); [DllImport("DLLTest.dll")] static extern int test3(ref structB p, int n); [StructLayout(LayoutKind.Sequential)] private struct structA { int a; int b; } [StructLayout(LayoutKind.Sequential)] private struct structB { int c; double d; }
static void Main(string[] args) { structA sta = new structA(); structB stb = new structB(); int n = 0; int ret;
n = 0; ret = test3(IntPtr.Zero, n); n = 1; ret = test3(ref sta, n); n = 2; ret = test3(ref stb, n); } } }
|