2015-06-05 4 views
6

У меня проблема с загрузкой внешней dll с использованием Python через Python для .NET. Я пробовал разные методологии после stackoverflow и аналогичных. Я попытаюсь обобщить ситуацию и описать все шаги, которые я сделал.Python for .NET

У меня есть dll, названный так, например. Test.NET.dll. Я проверил с dotPeek, и я вижу, щелкнув по нему, x64 и .NET Framework v4.5. На моем компьютере я установил .Net Framework 4.

Я также установил Python для .NET по-разному. Я думаю, что лучший из них - скачать .whl с этого сайта LINK. Я загрузил и установил: pythonnet-2.0.0.dev1-cp27-none-win_amd64.whl. Я могу представить, что он будет работать для .NET 4.0 с Требуется Microsoft .NET Framework 4.0.

После того, как я установил все, что я могу сделать следующие команды:

>>> import clr 
>>> import System 
>>> print System.Environmnet.Version 
>>> print System.Environment.Version 
4.0.30319.34209 

кажется работа. Затем я попытался загрузить мою DLL набрав следующие команды:

>>> import clr 
>>> dllpath= r'C:\Program Files\API\Test.NET' 
>>> clr.AddReference(dllpath) 

Traceback (most recent call last): 
    File "<pyshell#20>", line 1, in <module> 
    clr.AddReference(dllpath) 
FileNotFoundException: Unable to find assembly 'C:\Program Files\API\Test.NET'. 
    at Python.Runtime.CLRModule.AddReference(String name) 

Я также попытался добавить «.dll» в конце пути, но ничего не изменилось. Затем я также пробовал разные решения, как описано в LINK, LINK, LINK и многое другое .... К сожалению, он не работает, и я получаю разные ошибки. Я знаю, что существует IronPython, но я пытался избежать его использования.

Благодарим за помощь!

+0

1. Вы пробовали с FindAssembly? 2. Вы исследовали ошибки из окна просмотра привязки сборки (Fuslogvw.exe)? 3. Ваша сборка 64-разрядная, тоже Python 64-битная? – denfromufa

ответ

1

Был ли Test.NET.dll создан с другого компьютера? В соответствии с this нить некоторые функции безопасности .NET могут помешать DLL-файлам загружаться красиво.

Для сообщения более информативный ошибки, попробуйте

> from clr import System 
> from System import Reflection 
> full_filename = r'C:\Program Files\API\Test.NET' 
> Reflection.Assembly.LoadFile(dllpath) 

Если вы получите сообщение об ошибке вдоль линий

NotSupportedException: An attempt was made to load an assembly from a 
network location which would have caused the assembly to be sandboxed in 
previous versions of the .NET Framework. This release of the .NET Framework 
does not enable CAS policy by default, so this load may be dangerous. If 
this load is not intended to sandbox the assembly, please enable the 
loadFromRemoteSources switch. 

затем следующий решена проблема для меня:

  • Щелкните правой кнопкой мыши на Test.NET.Dll
  • выберите «Свойства»
  • на вкладке «Общие» нажмите на кнопку «Разблокировать»
  • нажмите на «Применить»
1

Это не полный ответ, но помочь для будущих читателей: Вы не следует доверять FileNotFoundException из clr.AddReference(dllpath) К сожалению, в то время как зондирующие сборки исключения проглатываются

public static Assembly AddReference(string name) 
{ 
    AssemblyManager.UpdatePath(); 
    Assembly assembly = null; 
    assembly = AssemblyManager.LoadAssemblyPath(name); 
    if (assembly == null) 
    { 
     assembly = AssemblyManager.LoadAssembly(name); 
    } 
    if (assembly == null) 
    { 
     string msg = String.Format("Unable to find assembly '{0}'.", name); 
     throw new System.IO.FileNotFoundException(msg); 
    } 
    return assembly ; 
} 

AssemblyManager.LoadAssemblyPath ласточки е xceptions

try { assembly = Assembly.LoadFrom(path); } 
catch {} 

AssemblyManager.LoadAssembly ласточка исключение слишком

try { assembly = Assembly.Load(name);} 
catch (System.Exception e) {} 

Вы можете проверить список возможных проглочены исключений в Assembly.LoadFrom и Assembly.Load выяснить возможные реальные причины