代码之家  ›  专栏  ›  技术社区  ›  Amy

如何判断是否从脚本运行时调用C程序集?

  •  2
  • Amy  · 技术社区  · 15 年前

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

    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方法是否在脚本运行时间内运行?是否可以向该运行时发出回拨(重新进入)?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Dino Viehland    15 年前

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

    也没有办法实际返回到ScriptRuntime。ScriptRuntime设计为可远程,并公开完全可远程的API。它由一个scriptDomainManager类支持,该类具有您希望在scriptRuntime上找到的所有功能。而且语言永远无法获得脚本运行时(或其他支持远程处理的API)的支持,因此它们总是在自己的应用程序域中本地运行。但您通常会发现SDM也同样有用。

    所以你只是这样做:

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

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

        2
  •  0
  •   pm100    15 年前

    检查你的堆栈

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

    您可以遍历堆栈帧,查看调用您的DLR帧是什么样子的。如果你看到那个帧,你就知道DLR正在呼叫你。