Импорт DLL с pythonnet
Я пытаюсь импортировать и использовать DLL в Python. Поэтому я использую 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)
2 ответа
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() должен работать.
Вот как это работает для меня. 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)
В строках питона "\"
это побег персонаж Чтобы действительно иметь символ обратной косой черты в строке Python, вам нужно добавить второй: "\\"
,
+ Изменить sys.path.append('C:\PathToDllFolder')
в sys.path.append('C:\\PathToDllFolder')
,
Я не уверен насчет clr.AddReference('MyDll.dll')
, версия без.dll должна работать: clr.AddReference('MyDll')
Использовать абсолютный путь к вашей dll
import clr
clr.AddReference('C:\PathToDllFolder\MyDll.dll')