私の DynamicObject 実装は次のようになります。
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 バイト Microsoft.CSharp. RuntimeBinder.RuntimeBinder. DispatchPayload (System.Dynamic.DynamicMetaObjectBinder ペイロード、Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject[] 引数、System.Collections.Generic.Dictionary ディクショナリ) + 0xb1 バイト
Microsoft.CSharp.RuntimeBinder.RuntimeBinder. バインドコア(System.Dynamic.DynamicMetaObjectBinder ペイロード、System.Collections.Generic.IEnumerable パラメーター、System.Dynamic.DynamicMetaObject[] args、out System.Dynamic.DynamicMetaObject deferredBinding) + 0xbc バイト
Microsoft.CSharp.RuntimeBinder.RuntimeBinder. Bind (System.Dynamic.DynamicMetaObjectBinder ペイロード、System.Collections.Generic.IEnumerable パラメーター、System.Dynamic.DynamicMetaObject[] args、out System.Dynamic.DynamicMetaObject deferredBinding) + 0x56 バイト
Microsoft.CSharp.RuntimeBinder.BinderHelper. 練る(System.Dynamic.DynamicMetaObjectBinder アクション、Microsoft.CSharp.RuntimeBinder.RuntimeBinder バインダー、System.Collections.Generic.IEnumerable 引数、System.Collections.Generic.IEnumerable arginfo、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(object[] 引数、System.Collections.ObjectModel.ReadOnlyCollection パラメーター、System.Linq.Expressions.LabelTarget returnLabel) + 0xea バイト System.Runtime.CompilerServices.CallSiteBinder. BindCore >(System.Runtime.CompilerServices.CallSite> site, object[] args) + 0x80 バイト System.Dynamic.UpdateDelegates. UpdateAndExecuteVoid3 (System.Runtime.CompilerServices.CallSite サイト、オブジェクト arg0、10 進数 arg1、double arg2) + 0x30e バイト MyApp.DynCallsite. マイメソッド(文字列 str1、10 進数、文字列 str2) 96 行目 + 0x17d バイト C#
特殊な派生クラスの代わりに DynamicObject インスタンスを使用しているように見えます。ただし、デバッガーで callsite オブジェクトを調べると、DynCallsite と表示されるため、そうではないことを確認しました。何が原因でしょうか?