2010-02-05 3 views
2

Предположив Я построил сборку с одним классом:Как вы узнаете, вызвана ли ваша сборка C# из ScriptingRuntime?

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() 

Как сказать, если мой метод Бар работает внутри ScriptingRuntime? Можно ли вернуть вызов в эту рабочую среду (повторный вход)?

+0

Почему? Что вы будете делать по-другому при вызове из ScriptingRuntime vs из другой управляемой dll? –

+0

Почему бы и нет? Вопрос возник ко мне сегодня, и, немного подумав об этом, должно быть средство, чтобы получить дескриптор текущей среды выполнения. Это вопрос любопытства. – Amy

ответ

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.

0

осмотреть ваш стек

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

вы можете идти вниз фреймы стеки и посмотреть, что DLR кадра вызова вы выглядите. Если вы видите тот кадр, который, как вы знаете, вы вызываете по dlr

+0

Но можно ли получить ссылку на среду выполнения? – Amy

+0

Я не знаю на ваш вопрос. Запустите тестовое приложение, которое выгружает стек в том случае, когда вы знаете, что вы вызываете DLR. Обратите внимание на имя obvioulsy DLR statck frame. NOw добавляет код, прогуливает стек и ищет этот фрейм. ЕСЛИ вы видите, что знаете, что вы вызываете DLR – pm100