2011-11-07 24 views
0

WCFサービスの自動生成プロキシーを作成して、手動でサービスプロキシーを作成しないようにします。Reflection.Emitパラメーターの受け渡し

 bool isVoid; 

     if ((isVoid = (methodInfo.ReturnType != typeof(void)))) 
      generator.DeclareLocal(methodInfo.ReturnType); 

     generator.Emit(OpCodes.Ldarg_0); 
     var channelProperty = baseType.GetMethod(ChannelPropertyGetName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty); 

     generator.EmitCall(OpCodes.Call, channelProperty, null); 

     for (short index = 0; index < parameters.Count(); index++) 
      generator.Emit(OpCodes.Ldarg, (index + 1)); 

     generator.Emit(OpCodes.Callvirt, methodInfo); 

     if (isVoid) 
     { 
      generator.Emit(OpCodes.Stloc_0); 
      generator.Emit(OpCodes.Ldloc_0); 
     } 

     generator.Emit(OpCodes.Ret); 

私もサービスし、適切なサービスを持っている:リフレクションを使用して

は、私は(アセンブリからメソッドへの)動的クラス生成の完全なサイクルを作成しましたし、私の方法の世代のコードはそうのように見える、放出します契約はそうのようになります。

[ServiceContract] 
public interface INamingService 
{ 
    /// <summary> 
    /// Resolve a name 
    /// </summary> 
    [OperationContract(Name = "GetName")] 
    string GetName(string name); 

} 

が、私は指定された名前(NOT NULL)で、このサービスから値を取得しようとしている、私は、クライアントの呼び出しから来るパラメータがnullであることがわかります。したがって、私が理解する限り、私はEmitで間違いを犯し、パラメータは渡されません。

この問題を解決する方法はありますか?ここで

+1

私の助言はあなたが望むコードをC#で書いてコンパイルし、生成されたILをあなたがそのタスクのために放出しているものと比較することです。 –

答えて

2

は、いくつかのマイナーなポイントです:それはないリターンボイドを行い方法ことを示しているので、

  1. isVoidが悪い名前のように思えます。
  2. あなたのローカルの使用は不要です - 単にそれを保存してすぐにその値をリロードするだけです。
  3. getterプロパティにEmitCallを使用している理由がわかりません。ほとんどの場合、代わりにEmitを使用してください(the documentationを参照)。

しかし、問題がIL生成にあると思われる理由はわかりません。私にはそれはあなたがいずれかの

  1. が誤って動的メソッドを宣言している、または
  2. 何とかプロキシを誤配線する可能性が高く聞こえます。
+0

あなたのコメントを考慮しました。ありがとうございます。 しかし、あなたが言ったように、ソリューションは直交した場所に置かれました - 私はバインディングを間違って定義しました。アドバイスありがとう – madcyree

関連する問題