2010-02-05 2 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() 

Bar 메서드가 ScriptingRuntime에서 실행 중인지 어떻게 알 수 있습니까? 해당 런타임에 다시 콜백을 발행 할 수 있습니까 (재입국)?

+0

왜? ScriptingRuntime에서 다른 관리되는 dll에서 호출 할 때 다르게 할 것인가? –

+0

왜 안 되니? 오늘 나에게 문제가 발생했다. 잠시 생각해 본 후에 현재 런타임을 처리 할 수있는 방법이 있어야한다. 이것은 호기심의 질문입니다. – Amy

답변

1

DLR 레벨에서 언어에 대한 호출 규칙이 필요 없기 때문에이를 수행 할 일반적인 방법은 없습니다. 그러나 IronPython과 IronRuby를 사용하여 특정 마법 매개 변수를 채 웁니다. IronPython의 경우 CodeContext이고 IronRuby의 경우 RubyContext라고 생각합니다. 그러나 이제는 언어 구현에 직접 의존하게 될 것입니다.

실제로 ScriptRuntime으로 돌아갈 방법이 없습니다. ScriptRuntime은 원격으로 디자인되었으며 완전히 원격으로 사용할 수있는 API를 제공합니다. 그것은 ScriptRuntime에서 찾을 수있는 모든 기능을 가진 ScriptDomainManager 클래스에 의해 지원됩니다. 그리고 언어는 ScriptRuntime (또는 Remoting을 지원하는 다른 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 프레임의 이름을 기록하십시오. 코드를 추가하면 스택을 걷고 해당 프레임을 찾습니다. 당신이 그것을 본다면 당신은 당신이 DLR에 의해 불려지고 있다는 것을 안다. – pm100

관련 문제