度々失礼いたします。
前回、C言語で作った自作DLLの関数をC#呼ぶ際に
文字列型の配列を引数にして、受け渡しをすることができた者です。
###現状
文字列型の配列を自作DLL内にある関数に渡すことができました。
以下コードになります。
C
1[DLL側] 2int TestArray(char *test,int size){ 3 for(int i = 0;i<size;i++){ 4 printf("%s\n",&test[i]); 5 } 6 return 0; 7}
C#
1[呼び出し側] 2 class Program 3 { 4 [DllImport("TestArrayDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 5 private extern static int TestArray([In, MarshalAs(UnmanagedType.LPArray, 6 ArraySubType = UnmanagedType.LPWStr,SizeParamIndex = 1)]string[] test, int split); 7 static void Main(string[] args) 8 { 9 string[] test = { "a", "b", "c", "d", "e"}; 10 TestArray(test, test.Length); 11 Console.ReadLine(); 12 } 13 }
###やりたいこと
文字列型の配列に格納されている文字列を出力(abcde)したい。
###問題点
上記コードを実行すると出力される文字列が**「文字化け」**を起こし、望む結果を得ることができていません。
###試したこと
StringBuilderクラスを使ってみましたが結果はSystem.String[]という文字が連続で表示されました。
C#
1[呼び出し側] 2 class Program 3 { 4 [DllImport("TestArrayDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 5 private extern static int TestArray([In, MarshalAs(UnmanagedType.LPStr)]StringBuilder test, int split); 6 static void Main(string[] args) 7 { 8 string[] test = { "a", "b", "c", "d", "e"}; 9 StringBuilder build = new StringBUilder(5); 10 build.Append(test); 11 12 TestArray(build, build.Length); 13 Console.ReadLine(); 14 } 15 }
###推察
1.もしかしたら参照渡しが完璧ではないのかもしれない?
2.渡した文字列を何かしらの方法で変換する必要がある?
前回と似たような質問になってしまい申し訳ありません。
アドバイス等頂けるとありがたいです。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/29 16:04