使用pythonnet导入DLL

时间:2018-04-24 09:40:18

标签: python .net dll python.net pythonnet

我正在尝试导入并在python中使用DLL。因此我使用的是pythonnet。

import sys
import clr

sys.path.append('C:\PathToDllFolder')

clr.AddReference('MyDll.dll')

但是代码会产生以下错误:

Traceback (most recent call last):
  File "E:\NET\NET_test.py", line 6, in <module>
    clr.AddReference('MyDll.dll')
System.IO.FileNotFoundException: Unable to find assembly 'MyDll.dll'.
   bei Python.Runtime.CLRModule.AddReference(String name)

DLL的目标运行时为:v4.0.30319

有没有办法找出导致失败的原因以及如何解决?

(如果需要,我也可以提供DLL)

4 个答案:

答案 0 :(得分:2)

在python字符串中"\"是一个转义字符。要在python字符串中使用真正的反斜杠字符,您需要添加第二个字符:"\\"

sys.path.append('C:\PathToDllFolder')更改为sys.path.append('C:\\PathToDllFolder')

我不确定clr.AddReference('MyDll.dll'),没有.dll的版本应该有效:clr.AddReference('MyDll')

答案 1 :(得分:2)

这就是我的工作方式。 DLL位于'/SDK/dll/some_net64.dll' 注意:不需要.dll扩展名。

import os, sys, clr
dll_dir = './SDK/dll/'
dllname = 'some_net64'
path = r'%s%s' % (dll_dir, dllname)
sys.path.append(os.getcwd())
clr.AddReference(path)

答案 2 :(得分:1)

clr.AddReference()很难描述错误。 找出导入失败原因的更好方法是使用它。

#use this section of code for troubleshooting
from clr import System
from System import Reflection
full_filename = r'C:\foo\bar\MyDll.dll'
Reflection.Assembly.LoadFile(full_filename)   #this elaborate the error in details

一种可能性是系统知道您的DLL是从其他地方下载的(甚至是Dropbox同步计数),并且不允许您使用该DLL文件。在这种情况下,您可以从 https://docs.microsoft.com/en-us/sysinternals/downloads/streams 并运行此命令以从DLL文件中删除所有这些标志。

stream -d MyDll.dll

然后,使用clr.AddReference()进行的导入应该可以工作。

答案 3 :(得分:0)

使用dll的绝对路径

import clr
clr.AddReference('C:\PathToDllFolder\MyDll.dll')