Импорт 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')
Другие вопросы по тегам