5

Python スクリプトから移植可能な .NET ライブラリ (標準の .NET および Silverlight 環境で使用される) をロードする際に深刻な問題があります。

.NET DLL ファイルのバージョンは 4.0.3.319.233 (System.Core.DLL)、IronPython は 2.7.1 で、32 ビット/x86 モードで実行されます。.NET 4 で C# を使用する Visual Studio 2010。ポータブル ライブラリを使用するための Microsoft .NET 更新プログラム KB2468871 もインストールされます (バージョン 2)。

Python スクリプトからライブラリをロードしようとすると、次のようになります。

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

アクセスできず、スクリプトが型に達すると、 「'namespace#' の属性 [ポータブル アセンブリの型] は読み取り専用です」と 表示され、アセンブリがまったく読み込まれていないことを示します (または 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, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

最後のコードは、Python スクリプトが別の .NET プログラム内から自動的に呼び出され、独自の Python エンジンをインスタンス化すると機能するように見えますが、スクリプトが Visual Studio の Python プロジェクトから実行されると上記のエラーが発生します。VisualStudio の Python 設定、Tools\Options\Python Tools\Interpreter Options は x86/32 ビット モード用です。すべての環境パラメーターは、.NET 4 が使用されていることを示しています。

C#/.NET で生成された Python エンジンから修正する方法は複数ありますが、ポータブル アセンブリを基本的な IronPython ランタイム環境にロードして、正しい .NET 4 環境で動作するようにするにはどうすればよいでしょうか。 .NET 2 のものをロードしますか?

更新: MS KB2468871 の更新後にポータブル ライブラリを再起動して再構築し、VS 用の IronPython と Python ツールをアンインストールして、バージョン 2.7.3 と 1.5 (VS2010) に置き換えました。「System.Core, Version=2.0.5.0」のエラーは引き続き発生します。

4

2 に答える 2

0

FileNotFoundException は、何かが Assembly.LoadFrom ではなく Assembly.LoadFile を使用してアセンブリを読み込んでいるが、アセンブリ ポリシーを正しく処理していないことを示しています。Visual Studio で Python コードがどのように機能するかはわかりませんが、ポータブル アセンブリが読み込まれる前にブートストラップ コードを実行できる場合は、ここで示したコードを試してください: PCL Retargetable Assembly not redirected within MS CRM Plugin

于 2013-08-02T16:06:19.993 に答える
-1

sys.path を使用して、.net dll がある場所へのパスを追加します。

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()
于 2013-08-01T21:19:11.480 に答える