4

最初のいくつかの背景(役立つ場合):

私のアプリケーションは、最近 .Net Framework の v3.5 にアップグレードされた Web ベースのフレームワークですが、マスター ページ/ユーザー コントロール システムを使用していません。これは MVC パターンに似ており (かなり古いですが)、テンプレートからの応答ストリームに純粋な HTML を出力します。Python 式を使用すると、いくつかのルールとテンプレートのバリエーションを実現できます。

古いやり方

IronPython 1.x エンジンを C# に組み込むと、次のようなコードを実行できました。

PythonEngine pe = new PythonEngine();
Assembly a = Assembly.LoadFile("path to assembly");
pe.LoadAssembly(a);
pe.Import("Script");

ipy 2.0 には Import() メソッドはなく、ImportModule() メソッドは同じようには機能しないようです。Import() は、私たちが書くすべての Python スクリプトに次のような行を入れる必要性を軽減しました:

from MyAssembly import MyClass

MyClass が静的メソッドでいっぱいであるという事実は、MyClass.MyMethod() への呼び出しが非常にうまく機能することを意味します。MyClass が含まれているアセンブリは実行時に動的に読み込まれるため、オブジェクトをインスタンス化してスコープ内の変数に割り当てることはできません。

では本題へ

IronPython 2.0 の統合の他のすべての部分を整理しましたが、実装者が作成するすべてのスクリプトの先頭に「from MyAssembly import MyClass」と入力することを要求したくありません (ipy 1. .x) であり、しばらくの間サポートの問題になる可能性もあります。

そして最後に質問です

誰かがこの問題を抱えて解決しましたか? DLR のやり方が間違っているのでしょうか? それとも明らかな何かが欠けていますか?

誰かが助けてくれるのに必要な詳細はわかりませんが、これで十分だと思います.

4

2 に答える 2

6

Scopeアセンブリが読み込まれたら、スクリプトの実行に使用しているでインポートを実行できます。

ScriptEngine engine = Python.CreateEngine();
engine.Runtime.LoadAssembly(a);
string code = "from MyAssembly import MyClass";
ScriptSource source = engine.CreateScriptSourceFromString(code, "<import>", SourceCodeKind.Statements);
CompiledCode c = source.Compile();

Scope scope = engine.CreateScope();
c.Execute(scope);

// then run your script in the same scope

私たちの製品でも同様のことをしています。

(うまくいけば、これは有効な C# です。より便利だったので、IronPython 自体で実際に試してみました。)

于 2009-01-23T14:57:27.370 に答える
1

ウィルバーフォースさん、ありがとう

最後に、私は次のことを行いました:

Assembly a = Assembly.LoadFile("path to assembly");
object var = a.CreateInstance("MyNamespace.MyClass");

Scope.SetVariable("MyClass", var);

これにより、C# でクラスのオブジェクトが作成され、変数として IronPython スコープに渡されました。

これは、C# スコープ (AppDomain) でオブジェクトを作成し、それを IronPython に渡すだけであることに注意してください。私が渡しているオブジェクトは静的メソッドだけでいっぱいですが、状態を持つクラスでは機能しない可能性があるため、これは(これまでのところ)私の問題では機能しているようです。

于 2009-01-28T21:01:21.103 に答える