我想为WCF服务创建一个自动生成的代理,它允许我避免手动创建服务代理。
使用反射发出,我创建了动态类生成的整个周期(从程序集到方法),方法生成的代码如下所示:
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);
}但是,当我尝试通过指定的名称(非null)从该服务中检索值时,我发现来自客户端调用的参数为null。因此,据我所知,我在Emit中犯了一个错误,参数没有传递。
有谁能给我一些建议,如何解决这个问题?
发布于 2011-11-08 00:22:45
以下是几个次要的要点:
isVoid似乎不是一个好名字,因为它表明该方法不返回the documentation).。
EmitCall作为属性getter;您几乎肯定应该使用Emit (请参见Emit但是,我不明白为什么您认为问题出在您的IL生成上;在我看来,您更有可能是
如果您的动态方法声明不正确,请以某种方式or
https://stackoverflow.com/questions/8037691
复制相似问题