2

単一のクラスでアセンブリを構築したと仮定します。

public class Foo
{
    public void Bar()
    {
           // If we're being called from IronPython, IronRuby, etc... do one thing
           // If not, print some message.  Or something.
    }
}

次に、ipy.exeから:

import clr
clr.AddReference('ThatAssembly.dll')
from ThatAssemblyNamespace import Foo
a = Foo()
a.Bar()

BarメソッドがScriptingRuntime内で実行されているかどうかを確認するにはどうすればよいですか?そのランタイムにコールバックを発行することは可能ですか(再入可能)?

4

2 に答える 2

1

DLR レベルでは、言語に必要な呼び出し規約がないため、これを行う一般的な方法はありません。しかし、IronPython と IronRuby の両方で、特定の魔法のパラメーターを入力します。IronPython の場合は CodeContext で、IronRuby の場合は RubyContext だと思います。しかし、これは、言語の実装に直接依存するようになることを意味します。

また、実際に ScriptRuntime に戻る方法もありません。ScriptRuntime はリモート可能になるように設計されており、完全にリモート可能な API を公開しています。これは、ScriptRuntime で期待されるすべての機能を備えた ScriptDomainManager クラスによって支えられています。また、言語は ScriptRuntime (またはリモート処理をサポートする他の A​​PI) を取得しないため、常に独自のアプリ ドメインでローカルに実行されます。しかし、一般的には、SDM も同様に便利であることがわかります。

したがって、次のようにします。

public class Foo {
    public void Bar(CodeContext context) {
         context.LanguageContext.DomainManager.GetLanguageByName("IronRuby");
    }
}

API を他の言語から呼び出せるようにする場合は、CodeContext を使用しないオーバーロードを追加する必要があります。

于 2010-02-06T03:13:10.943 に答える
0

inspect your stack

http://www.csharp-examples.net/reflection-callstack/

you can walk down the stack frames and see what the dlr frame invoking you looks like. If you see that frame you know you are being called by dlr

于 2010-02-05T19:57:15.960 に答える