pythonnetを使って.NETのDLLをpythonから呼ぶときの注意点とエラー対処方法


pythonnet - Python.NETとは

Pythonから.NET向けのDLLを呼び出すことができるライブラリです.
MITライセンスとなっており,だれでも無償で使うことができます.
https://github.com/pythonnet/pythonnet

使い方

使い方はこちらの記事が大変参考になりました.
Pythonから.NETを呼び出す方法とついでにその逆も

ここでは簡単に紹介します.

インストール方法

pip install pythonnet

使用例

test.pyと同じディレクトリにあるABCLIb.dllを使いたい場合.
別のディレクトリにある場合は適宜パスを追加してください.clr.AddReference('./DEF/ABCLib')など.

test.py
import clr

clr.AddReference('ABCLib')
from ABCTools import ABCLib

abc = ABCLib()

clrはCommon Language Runtimeの略のようです.

注意点とエラーが起きたとき対処方法

私がpythonnetを使用したときにつまづいたポイントとその対象方法を紹介します.

.dllを書かない

エラー:System.IO.FileNotFoundException: Unable to find assembly 'ABCLib.dll'.
clr.AddReferenceするときに拡張子'.dll'を書いているとこのエラーが発生します。
'.dll'を消してみましょう。

# エラーが発生する例
clr.AddReference('ABCLib.dll')

# エラーが発生しない例
clr.AddReference('ABCLib')

セキュリティを許可する

エラー:System.IO.FileNotFoundException: Unable to find assembly 'ABCLib'.
外部から取得してきたdllの場合、ファイルへのアクセスがブロックされていることがあります。
アクセスを許可する設定をしてみてください。
dllファイルで右クリック→プロパティ→全般→最下段の「許可する」にチェック→OK

DLLとPythonで64bit/32bitを合わせる

エラー:System.IO.FileNotFoundException: ファイルまたはアセンブリ 'ABCLib, Version=~~~~~~~~, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

DLLとPythonのbitが合っていないと読み取ることができませんでした。

  • Pythonのbitの調べ方
import sys
print(sys.version)
出力
3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]