VisualStudio2017 C#(.NetFrameword 4.7.1)で、MeCab(0.996)のlibmecab.dllを参照し形態素解析を行う場合、下記のソースでMeCabの解析結果を得ることができる。
using System;
using System.Runtime.InteropServices;
class Program
{
const string MECAB_LIB_PATH = @"C:\Program Files (x86)\MeCab\bin\libmecab.dll";
[DllImport(MECAB_LIB_PATH, CallingConvention = CallingConvention.Cdecl)]
extern static IntPtr mecab_new2(String arg);
[DllImport(MECAB_LIB_PATH, CallingConvention = CallingConvention.Cdecl)]
extern static IntPtr mecab_sparse_tostr(IntPtr ptrMeCab, String arg);
[DllImport(MECAB_LIB_PATH, CallingConvention = CallingConvention.Cdecl)]
extern static void mecab_destroy(IntPtr ptrMeCab);
static void Main(string[] args)
{
try
{
var ptrMeCab = mecab_new2("");
var ptrResult = mecab_sparse_tostr(ptrMeCab, "テストデータ");
var strResult = Marshal.PtrToStringAnsi(ptrResult);
mecab_destroy(ptrMeCab);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
}
strResult変数には、下記実行結果が出力される。
"テスト\t名詞,サ変接続,*,*,*,*,テスト,テスト,テスト\nデータ\t名詞,一般,*,*,*,*,データ,データ,データ\nEOS\n"
libmecab.dllを使用する場合、下記2つに気を付けないとはまる。
1、libmecab.dllを参照しているプロジェクトはx86で実行しないといけない。
x64やAnyCPUで実行すると、mecab_new2("")メソッド実行時に「間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外:0x8007000B)」例外が発生する。
2、DllImport()の定義には、「CallingConvention = CallingConvention.Cdecl」を記述しないといけない。
「CallingConvention = CallingConvention.Cdecl」を記述していないと、mecab_new2("")メソッド実行時に「MeCabテスト!MeCabテスト.Program::mecab_new2' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。'」例外が発生する。
最近のコメント