2012-07-08 6 views
0

내 DynamicObject 구현은 다음과 같습니다왜 내 TryInvokeMember가 호출되지 않습니까?

public class DynCallsite: DynamicObject 
{ 
    public DynCallsite(ScriptPlayer player) 
    { 
     _player = player; 
    } 

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
    { 
     var ftt = new CallTranslator(); 

     var request = ftt.CreateXmlRequest(binder.Name, args); 

     var callResult = _player.CallFunction(request); 
     result = ftt.DeserializeXmlRequest(callResult); 

     return true;    
    } 

    private ScriptPlayer _player; 
} 

이 내가이 개체의 인스턴스 사용하고 방법은 다음과 같습니다

class DynHost 
{ 
    public DynHost() 
    { 
     _callSite = new DynCallsite(new ScriptPlayer()); 
    }  

    public dynamic Callsite 
    { 
     get { return _callsite; } // A breakpoint put here will be hit 
    } 
} 

// *snip* 

var dh = new DynHost(); 
dh.Callsite.MyMethod("str1", 5, "str2"); 

그것은 사용 : 작업에를 잘 모르겠어요 무엇이 바뀌 었습니다. 디버거가 TryInvokeMember 호출을 중단시키지 않고 RuntimeBinderException이 표시됩니다. 이 클래스는 실행중인 어셈블리와 다른 어셈블리에 정의되어 있습니다 (동일한 솔루션에서 프로젝트에 대한 참조를 추가하여 정상적인 방법으로 참조됩니다).

Microsoft.CSharp.RuntimeBinder.RuntimeBinderController :

인스턴스에 호출을 수행 한 후, 나는 다음과 같은 스택 추적을 얻고있다. SubmitError (Microsoft.CSharp.RuntimeBinder.Errors.CError pError) + 0x23 바이트
Microsoft.CSharp.RuntimeBinder.Semantics.LangCompiler. SubmitError (Microsoft.CSharp.RuntimeBinder.Errors.CParameterizedError 오류) + 0x24 바이트
Microsoft.CSharp.RuntimeBinder.Errors.ErrorHandling. ErrorTreeArgs (Microsoft.CSharp.RuntimeBinder.Errors.ErrorCode ID, Microsoft.CSharp.RuntimeBinder.Errors.ErrArg [] prgarg) + 에는 0x53 바이트 Microsoft.CSharp.RuntimeBinder.Semantics.MemberLookup. ReportErrors() + 0x6cd 바이트
Microsoft.CSharp.RuntimeBinder.RuntimeBinder. BindCall (Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder 페이로드 Microsoft.CSharp.RuntimeBinder.Semantics.EXPR callingObject, Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject [] 인수 System.Collections.Generic.Dictionary 사전) + 0x206 bytes Microsoft.CSharp.RuntimeBinder.RuntimeBinder. (System.Dynamic.DynamicMetaObjectBinder 페이로드 Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject [] 인수 System.Collections.Generic.Dictionary 사전) + 0xb1 바이트
Microsoft.CSharp.RuntimeBinder.RuntimeBinder을 DispatchPayload. BindCore (System.Dynamic.DynamicMetaObjectBinder 페이로드 System.Collections.Generic.IEnumerable 파라미터 System.Dynamic.DynamicMetaObject [] args를 아웃 System.Dynamic.DynamicMetaObject deferredBinding) + 0xbc 바이트
Microsoft.CSharp. RuntimeBinder.RuntimeBinder. 귀속 (System.Dynamic.DynamicMetaObjectBinder 페이로드 System.Collections.Generic.IEnumerable 파라미터 System.Dynamic.DynamicMetaObject [] args를 아웃 System.Dynamic.DynamicMetaObject deferredBinding) + 0x56 바이트
Microsoft.CSharp. RuntimeBinder.BinderHelper. 바인딩 (System.Dynamic.DynamicMetaObjectBinder 작업, Microsoft.CSharp.RuntimeBinder.RuntimeBinder 바인더, System.Collections.Generic.IEnumerable을 인수, System.Collections.Generic.IEnumerable arginfos, System.Dynamic.DynamicMetaObject onBindingError) + 0x2ca 바이트 Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder. FallbackInvokeMember (System.Dynamic.DynamicMetaObject 대상 System.Dynamic.DynamicMetaObject [] args를 System.Dynamic.DynamicMetaObject errorSuggestion) + 0x77 바이트
System.Dynamic.DynamicObject.MetaDynamic.BindInvokeMember한다. AnonymousMethod__10 (System.Dynamic.DynamicMetaObject e) + 0x1b 바이트
System.Dynamic.DynamicObject.MetaDynamic. BindInvokeMember (System.Dynamic.InvokeMemberBinder 바인더 System.Dynamic.DynamicMetaObject [] 인수) + 0xb8 바이트 System.Dynamic.InvokeMemberBinder.Bind (System.Dynamic.DynamicMetaObject 대상 System.Dynamic.DynamicMetaObject [] 인수) + 0x36 바이트 System.Dynamic.DynamicMetaObjectBinder.Bind (오브젝트 [] args를 System.Collections.ObjectModel.ReadOnlyCollection 파라미터 System.Linq.Expressions.LabelTarget returnLabel) + 0xea 바이트 System.Runtime.CompilerServices.CallSiteBinder. BindCore> (System.Runtime.CompilerServices.CallSite> 사이트, 개체 [] args) + 0x80 바이트 System.Dynamic.UpdateDelegates. UpdateAndExecuteVoid3 (System.Runtime.CompilerServices.CallSite 사이트, 개체 arg0, 10 진수 arg1, double arg2) + 0x30e 바이트 MyApp.DynCallsite. (문자열 str1과, 진수, 문자열과 str2) 라인 96 + 0x17d 바이트 C# .NET을 MyMethod라는

그것은 꽤 많이 보이는 내가 대신 내 전문 파생 클래스의 DynamicObject 인스턴스를 사용하는 것처럼있다. 그러나 디버거에서 callsite 객체를 검사 할 수 있고 DynCallsite가 말하기 때문에 이것이 사실이 아니라고 확인했습니다. 무엇이 이것을 일으킬 수 있습니까?

+1

개체를 어떻게 사용하고 있는지 표시하지 않았습니다. 문제를 시연하는 짧지 만 완전한 프로그램을 제작할 수 있다면 정말 도움이 될 것입니다. –

+0

을 사용하여 미래에 어떤 변화가 일어 났는지 확실하지 않게하려면 [mercurial] (http://hginit.com/)과 같은 버전 제어 시스템 사용을 고려하십시오. – Adam

+0

사용 예가 추가되었습니다. –

답변

0

다이내믹을 직접 사용하면 효과가 있다고 생각합니다. 문제는 재산을 통해 반환 할 수 있습니다. 이 방법은 WPF 데이터 바인딩에서 작동합니다. DataContext로 동적으로 직접 지정하면 바인딩이 작동합니다. 내가 사용하는 속성을 사용하면 bindig 오류가 발생합니다.

관련 문제