项目
我开发了一个远程处理类,用于替换 WCF 的子集。这样做是因为我们的目标是使用 Unity3D 的移动平台,并且需要保持内存消耗尽可能小。(所以我们不需要包含 System.ServiceModel,它实际上有 2.7MB 的大小,这对于小型移动 RAM 来说已经很多了)
它现在适用于所有类型(包括将使用我自己多年前编写的序列化程序进行序列化的复杂类型),并且它还能够处理复杂情况(A 调用 B,B 调用 A,A 返回一些东西,B 返回一些东西)。
方法调用
对于我正在使用的目标站点上的调用方法,Type.InvokeMember
除了可空类型之外,它实际上适用于大多数情况。这就是我面临的问题。在我的接口定义中,该方法如下所示:
public interface IServerContract
{
void SetUsageID(Int32? id);
}
(ServerProxy
处理远程方法调用的对象)我正在执行以下操作:
public class ServerProxy : ProxyBase
{
public void SetUsageID(Int32? id)
{
RemoteCall("SetUsageID", id);
}
}
像往常一样,参数id
被装箱,因为 的定义RemoteCall
如下所示:
public void RemoteCall(String methodName, params Object[] arguments) { ... }
在这一点上,我只得到了一个System.Int32
而不是一个可为空的。我正在序列化参数并在目标机器上反序列化它们。此时我正在调用Type.InvokeMethod
这会导致异常,因为他找不到将 aInt32
作为第一个参数的方法(第二个当不忽略此参数时)。
这个问题的最佳解决方案是什么?有多种方法,但都会对性能产生影响。