내 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가 말하기 때문에 이것이 사실이 아니라고 확인했습니다. 무엇이 이것을 일으킬 수 있습니까?
개체를 어떻게 사용하고 있는지 표시하지 않았습니다. 문제를 시연하는 짧지 만 완전한 프로그램을 제작할 수 있다면 정말 도움이 될 것입니다. –
을 사용하여 미래에 어떤 변화가 일어 났는지 확실하지 않게하려면 [mercurial] (http://hginit.com/)과 같은 버전 제어 시스템 사용을 고려하십시오. – Adam
사용 예가 추가되었습니다. –