私は次の関数マーシャリング(アンマネージドタイプに構造を渡す)
long func(struct name * myname)
{
strcpy(myname->firstname,"rakesh");
strcpy(myname->lastname,"agarwal");
return S_OK;
}
struct name
{
char firstname[100];
char lastname[100];
}
を公開し、C++のDLLを持って、私はC#アプリケーションからこの関数を呼び出すにしたいので、私は次のようにします
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
unsafe public struct name
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)]
public string firstname;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string lastname;
} ;
[DllImport("C++Dll.dll")]
public unsafe static extern long func(name[] myname);
name[] myname = new name[1];
func(myname);
アプリケーションが正常に構築されます。 C#アプリケーション.exeが実行されると、関数func()
が正常に呼び出され、dllの内部にフィールドを正常に埋め込むことができます。しかし、関数がC#アプリケーションに戻るとき、変数myname
は構造体フィールド(firstname
とlastname
)のnull値を引き続き満たします。
私はmyname
のフィールド値を移入することができていますように、機能func()
終了実行後、変数myname->firstname
は「ラケッシュ」が含まれているとmyname->lastname
は「Agarwalさん」が含まれるように(変更を提案してください
注:StringBuilderのを構造の内部で使用することはできません