質問: SampleFunc(foo); //ret にはエラーコードが入ってしまう。 } } ```
回答: 既定のマーシャリング.aspx)やプラットフォーム呼び出しによるデータのマーシャリング.aspx)が参考になるでしょうか。(ページの左ツリーにある下階層も。) > > //FOO構造体メンバ > > Var_1 (型:unsigned char, サイズ16、In) > > Var_2 (型:unsigned char, サイズ24、In) > > Var_3(型:unsigned char, サイズ128、Out) > > > に対応するC#コードは ``` [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct Foo { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string Var_1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)] public string Var_2; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string Var_3; } ``` また > > //関数: > > long Sample( FOO * foo ); > > > に対応するC#コードですが、C++言語における`long`のサイズは環境依存です。例えばVisual C++では`long`は4バイトです。ですのでC#言語でも4バイトとなる`int`を選択する必要があります(C#言語における`long`は8バイトです)。 ``` [DllImport("SampleFunc.dll", CallingConvention = CallingConvention.Cdecl)] private extern static int SampleFunc(ref FOO foo); ``` 以上のように正しく宣言してあれば、後は.NET Frameworkランタイムが正しく変換してくれるため特別な操作は必要ありません。 > > //FromHexString関数(自作)で16進数文字列をByteに変換している部分。C#の文字列をどう渡せば正直よくわからないです。 > > > 質問文にどのような値を渡す必要があるのかが提示されていないので、この点は第三者には不明です。