Python для .NET

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

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

Я также устанавливал Python для .NET разными способами. Я думаю, что лучше всего скачать .whl с этого веб-сайта ССЫЛКА. Я скачал и установил: 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» в конце пути, но ничего не изменилось. Затем я также пробовал различные решения, как описано в ССЫЛКА. , ССЫЛКА, ССЫЛКА и многое другое.... К сожалению, это не работает, и я получаю разные ошибки. Я знаю, что IronPython существует, но я старался не использовать его.

Спасибо за вашу помощь!


person user3075816    schedule 05.06.2015    source источник
comment
1. Вы пробовали с FindAssembly? 2. Изучали ли вы ошибки средства просмотра журнала привязки сборки (Fuslogvw.exe)? 3. ваша сборка 64-битная, Python тоже 64-битный?   -  person denfromufa    schedule 07.09.2015


Ответы (2)


Test.NET.dll взят с другого компьютера? Согласно этой теме, некоторые функции безопасности .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
  • выберите «Свойства»
  • на вкладке «Общие» нажмите «Разблокировать».
  • нажмите «Применить»
person DrJSomeday    schedule 13.11.2015

Это не полный ответ, а помощь будущим читателям: вы не должны доверять 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 проглатывает исключения

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

AssemblyManager.LoadAssembly тоже проглатывает исключения

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

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

person Serge P    schedule 08.12.2015