VisualStudio2017 C#(.NetFrameword 4.7.1)で、MeCab(0.996)の libmecab.dllを参照し形態素解析を行う場合、下記のソースで MeCabの解析結果を得ることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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変数には、下記実行結果が出力される。
1 2 3 |
"テスト\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 シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。’」例外が発生する。
コメント