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。它由 ScriptDomainManager 类提供支持,该类具有您希望在 ScriptRuntime 上找到的所有功能。而且语言永远不会使用 ScriptRuntime(或其他支持远程处理的 API),因此它们总是在自己的应用程序域中本地运行。但您通常会发现 SDM 也同样有用。

所以你只需这样做:

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

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

于 2010-02-06T03:13:10.943 回答
0

检查你的堆栈

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

您可以沿着堆栈帧走下去,看看调用您的 dlr 帧是什么样子的。如果你看到那个框架,你就知道你正在被 dlr

于 2010-02-05T19:57:15.960 回答