マネージコード考察


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();

・上段は、アンマネージのDLLを呼び出します。 ・下段は、インポートしたマDLLを、マネーjの関数として使用するために必要です。
 関数プロトタイプみたいなものでしょうか?

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に代入します。

トップへ戻る