2012-01-21 5 views
2

IronPython.dll、IronPython.Modules.dll、Microsoft.Dynamic.dll、Microsoft.Scripting.dllおよびMicrosoft.Scripting.Metadata.dllを自分のアプリケーションにマージするのに問題があります。IronPythonでILMergeを使用する

Pythonスクリプトを実行しようとしているときに私が得た最初のエラーだった:

MissingMemberException:

「『NullImporter』オブジェクトが 『find_module』は属性を持っていない」これは省略することによって解決されました/ ILMergeのパラメータを内部化する。 IronPythonは、機能するためには特定の型をパブリックにする必要があるようです。

しかし、それはあまり助けにはならなかったが、今私が得た:

ImportException:

いずれの場合も、例外は私のスクリプトの最初の行のためにスローされ、「CLRという名前のモジュールを」もちろん、それはちょうど "輸入clr"です。

答えて

2

悲しいことに、IronPythonのような非常に動的なランタイムは、ILMergeの後の作業に関して最も協調的ではないようです。

LINQPadのようなシングルEXEプロジェクトでは、組み込みの埋め込みトリックを実行することを検討することがあります。

  1. アプリケーションのリソースに依存するサードパーティのアセンブリをすべて埋め込みます。
  2. AppDomain.CurrentDomain.AssemblyResolveイベントでResolveEventHandlerを登録します。
  3. リソースに格納されているアセンブリでハンドラが呼び出されるときは、アセンブリをロードします。

次のようにして、第3部の操作を行います。

var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name); 
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue)); 

あなたはより多くの助けが必要な場合は、LINQPad.exeでつつくとLinqPad.Program.AddLINQPadAssemblyResolver()LinqPad.Program.FindAssem()で見ることができます。

更新:このアプローチの詳細については、a blog post by Jeffrey Richterが見つかりました。

+0

これはこれを行う方法と思われます。あなたがリンクしたブログ記事のコメントから: "ILMergeの著者として、これは素晴らしいと思います!これについて知っていれば、ILMergeを書いたことはありませんでした。 – Marcel

関連する問題