マネージコード考察
using System; using System.Text; using System.Runtime.InteropServices; namespace HelloDriverCS { class Program { [DllImport("Hello001.dll", EntryPoint = "HelloMsg")] private extern static IntPtr HelloMsg(); static void Main(string[] args) { int N = 32; byte[] buff = new byte[N]; Marshal.Copy(HelloMsg(), buff, 0, N); String str = Encoding.GetEncoding("Shift-JIS").GetString(buff); Console.WriteLine(str); } } }
C#で実装をします。
using System.Runtime.InteropServices;
・以下、DLLImportを呼ぶために必要です。
[DllImport("Hello001.dll", EntryPoint = "HelloMsg")]
private extern static IntPtr HelloMsg();
関数プロトタイプみたいなものでしょうか?
int N = 32;
・バッファの長さを明示的に決めてあげる必要があるので、その長さを指定します。byte[] buff = new byte[N];
・バッファに指定する型は「byte」です。「char」で受けるのではありませんので、ココは間違わないでください。・アンマネージでは、基本char型は1バイトです。しかし、マネージでは、char型は2バイトなのです!!
Marshal.Copy(HelloMsg(), buff, 0, N);
・マーシャルコピーと呼ばれるAPIです。・意味合いとしては、「アンマネージの値をマネージにコピー」です。
・上記では、buff[0]を先頭にHelloMsg()の返却値からNバイトをコピーするだと思います。
String str = Encoding.GetEncoding("Shift-JIS").GetString(buff);
・byte配列のbuffをShift-JISにエンコードして、文字列として、strに代入します。トップへ戻る