如何判断是否从ScriptingRuntime调用了C#程序集?

时间:2010-02-05 19:47:23

标签: .net dynamic-language-runtime

假设我使用单个类构建了一个程序集:

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中运行?是否可以向该运行时发出回调(重新进入)?

2 个答案:

答案 0 :(得分:1)

没有通用的方法可以做到这一点,因为在DLR级别没有必要的语言调用约定。但是对于IronPython和IronRuby,我们将填写某些神奇的参数。对于IronPython,它是CodeContext,对于IronRuby,我相信它是RubyContext。但这意味着你现在将直接依赖语言实现。

实际上还没有办法回到ScriptRuntime。 ScriptRuntime旨在提供远程处理,并公开一个完全可远程访问的API。它由ScriptDomainManager类支持,该类具有您希望在ScriptRuntime上找到的所有功能。语言永远不会得到ScriptRuntime(或支持远程处理的其他API),因此它们总是在自己的应用程序域中本地运行。但是你通常会发现SDM同样有用。

所以你只是这样做:

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

如果您希望API可以被其他语言调用,您需要添加一个不带CodeContext的重载。

答案 1 :(得分:0)

检查你的筹码

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

你可以沿着堆栈框架走下去,看看调用你的dlr框架是什么样的。如果您看到该帧,则表示您正在调用dlr