Как загрузить переносимую библиотеку .NET в скрипт Iron Python?

У меня серьезные проблемы с загрузкой переносимой библиотеки .NET (для использования в стандартной среде .NET и Silverlight) из скрипта Python.

Версия файла .NET DLL — 4.0.3.319.233 (System.Core.DLL), IronPython — 2.7.1, работает в режиме 32bit/x86. Visual Studio 2010 с C# под .NET 4. Также установлено обновление Microsoft .NET KB2468871 для использования переносимой библиотеки (версия 2).

Если я попытаюсь загрузить библиотеку из скрипта Python:

clr.AddReferenceToFileAndPath(UsedPath+"\\MyNamespace\\MyPortableLibrary.dll")

к нему нельзя получить доступ, и когда скрипт достигает типа, он говорит: "атрибут [тип в переносимой сборке] пространства имен#' доступен только для чтения", указывая на то, что сборка не была загружена вообще (или как Silverlight и не может использоваться сценарием Python).

Изменение кода на: (класс сборки из System.Reflection)

PortableAssembly = Assembly.LoadFrom(UsedPath+"\\MyNamespace\\MyPortableLibrary.dll") # load through .NET Reflection, Python won't load Portable assembly properly!
clr.AddReference(PortableAssembly)

приводит к ошибке: exceptions.IOError. Сообщение: [Errno 2] Не удалось загрузить файл или сборку «System.Core, версия = 2.0.5.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes» или одна из его зависимости. Системе не удается найти указанный файл.

Последний код, кажется, работает, когда скрипт Python вызывается автоматически из другой программы .NET, создавая экземпляр собственного механизма Python, но выдает указанную выше ошибку, когда скрипт выполняется из проекта Python в Visual Studio. Настройки Python в VisualStudio, Tools\Options\Python Tools\Interpreter Options предназначены для режима x86/32bit. Все параметры среды показывают, что используется .NET 4.

Теперь у меня есть несколько способов исправить это из созданного на C#/.NET движка Python, но как я могу загрузить переносимую сборку в базовую среду выполнения IronPython, чтобы она работала в правильной среде .NET 4, не пытаясь загрузить любой материал .NET 2?

Обновление: я перезапустил и пересобрал свою портативную библиотеку после обновления MS KB2468871, а также удалил инструменты IronPython и Python для VS, заменив их версиями 2.7.3 и 1.5 (VS2010). Ошибка с «System.Core, Version=2.0.5.0» все еще возникает.


person Erik Hart    schedule 08.05.2013    source источник
comment
Вы нашли решение этой проблемы? Я сталкиваюсь с этим уже 2 дня, и я не могу заставить его работать.   -  person Arnold Pistorius    schedule 22.06.2015


Ответы (2)


Исключение FileNotFoundException указывает на то, что что-то загружает сборки с помощью Assembly.LoadFile вместо Assembly.LoadFrom, но неправильно обрабатывает политику сборки. Я не уверен, как работает код Python в Visual Studio, но если вы можете запустить любой код начальной загрузки до того, как переносимая сборка будет загружена, попробуйте код, который я показал здесь: Перенаправляемая сборка PCL не перенаправляется внутрь подключаемого модуля MS CRM.

person David Kean    schedule 02.08.2013

используйте sys.path, чтобы добавить пути к вашим библиотекам .net:

import sys
sys.path.append("c:\MyDotNetDir");

import clr
clr.AddReference("MyDotNetAssembly.dll")

# do not forget to import the namespace

import Erik.MyDotNetAssemblyNamespace

inst = Erik.MyDotNetAssemblyNamespace.MyDotNetObject()
person user1968335    schedule 01.08.2013
comment
Хотя в FileNotFoundException отсутствует сборка, ссылки на переносимые библиотеки обрабатываются особым образом, и это исключение указывает на то, что кто-то загружает нас неправильно. - person David Kean; 02.08.2013