假设我使用单个类构建了一个程序集:
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中运行?是否可以向该运行时发出回调(重新进入)?
答案 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