何年か前にミクミンPのtweet https://twitter.com/ksasao/status/928643759822086144 によりWindows OCR (Windows.Media.Ocr
) の存在を知り、今年になって突然思い出したので試してみました。
ビルドできるようになるまでに無用な手間が多かったので、それの記録です。コードは参考コードそのまま動かしただけなので、この記事内に独自の情報はありません。
手順概要
- .csproj ファイルに主導で TargetPlatformVersion を追加
- Windowsのアセンブリ情報がVisual Studioから参照できるように細工
- C#プロジェクトの参照設定で Windows → コア から WinRT 関係のアセンブリを参照
- 必要なdllを参照
- 非同期周りをどうにかするコードを用意
- (準備完了。あとはコードを書くだけ)
参考にした資料
- [1]ミクミンPのGist https://gist.github.com/ksasao/43879bfead8d4308290b95d84effa693
- [2]そこにあるリンク http://www.moonmile.net/blog/archives/8584
- [3]さらにその先 https://blog.xin9le.net/entry/2012/11/12/123231
- [4]dll周りの問題解決 https://kakusuke98.hatenablog.com/entry/2019/09/26/125207
手順詳細
.csproj ファイルに主導で TargetPlatformVersion を追加
資料[2] より。
C#プロジェクトファイルをテキストエディタで開いて、それっぽい数値で追加。
Windowsのアセンブリ情報がVisual Studioから参照できるように細工
Windows 10 の 1903 で起きた問題らしいので、いずれ解決されて不要な手順になりそう。
資料[4] ではコピーしているけど、重複するのも微妙なので手元では system32/WinMetadata
へのシンボリックリンクを SysWOW64/WinMetaqdata
として作成。
C#プロジェクトの参照設定で Windows → コア から WinRT 関係のアセンブリを参照
ここまでの手順で参照できるようになっているはずなので、資料[2] そのままの手順でいけるはず。
必要なdllを参照
これも 資料[2] そのまま。参照マネージャーでなぜか「OK」の左にある「参照」ボタンから System.Runtime.WindowsRuntime.dll
を探して選択します。
C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETCore/(.NETのバージョン)/System.Runtime.WindowsRuntime.dll
みたいな場所にあるはず。
非同期周りをどうにかするコードを用意
資料[3] を見ると System.WindowsRuntimeSystemExtensions
がうまくやってくれそうなことを書いてあるけど、これはどうやって使うのか謎で検索しても全然情報がありません。資料[2] でも 「うまくいかないので自前で作る」 とあるので、そういうものなのでしょうか。資料[2] 「GetAwaiter メソッドを自作で拡張する」にある TaskEx クラスと同等のものを作りましょう。
これでようやく資料[1]のサンプルコード、 await ocrEngine.RecognizeAsync(bitmap)
あたりがコンパイル、ビルドできるようになります。スタート地点です。