我想爲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)該服務獲取價值,我看到,從客戶端調用出現的參數爲空。因此,就我所知,我在Emit中犯了一個錯誤,參數沒有通過。
任何人都可以告訴我,如何解決這個問題?
我的建議是在C#中編寫你想要的代碼,編譯它,然後比較生成的IL和你爲這個任務發佈的內容。 –