Tag: .net remoting

.Net Remoting与WCF

我想知道我可以从.net远程处理和WCF做同样的事情,那么为什么WCF比.Net远程处理更受欢迎。 我在哪里可以选择(或在哪种情况下).Net远程处理或WCF?

使用强命名程序集中定义的旧版本接口创建客户端激活对象时的System.InvalidCastException

我有一个关于.Net Remoting,版本控制和创建客户端激活对象的查询。 这是场景: 有2个接口,驻留在它们自己的程序集“SharedTypes”中:IServer和IAccount。 IServer包含返回字符串的方法“GetStatus”和返回IAccount类型的“CreateAccount”。 这是作为v1.0.0.0注册到GAC中的。 服务器应用程序引用SharedTypes并使用具体类Server和Account实现IServer和IAccount。 这些是MarshalByRefObject对象。 Server应用程序将Server类编组为单例对象。 客户端应用程序引用SharedTypes并成功通过IServer接口连接到可远程服务器对象。 在这里,我可以成功调用GetStatus和CreateAccount(它返回一个客户端激活的对象)。 到目前为止一切都好。 现在我将SharedTypes的版本增加到v2.0.0.0并注册到GAC,删除旧的v1.0.0.0版本。 Server应用程序是针对此版本构建的,但客户端不是。 现在,当我运行客户端应用程序时,它会按预期抱怨System.IO.FileNotFoundException,即它无法在GAC中找到v1.0.0.0的SharedTypes。 如果我在客户端的exe目录中复制SharedTypes的v1.0.0.0,则客户端应用程序最终会绑定到此(在GAC查找失败后)。 客户端应用程序启动,我可以成功调用IServer对象上的GetStatus(通过单例对象)。 但是,如果我调用CreateAccount – 它应该返回一个客户端激活的对象,我会得到以下exception: System.InvalidCastException: Return argument has an invalid type. at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType) at System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at SharedTypes.IServer.GetAccount() 我的问题是为什么在服务器上调用GetStatus从客户端(使用v1.0.0.0)激活单例对象不会抛出此exception,而通过CreateAccount创建客户端激活对象呢? 由于这两种类型都是在服务器上创建的,我认为GetStatus调用会产生相同的exception吗?

我可以用throw删除空捕获吗?

我希望这很简单。 我在一个大型代码库上工作,整体质量很好,但偶尔你会得到一些: try { // Calls a .NET remoting method. } catch { throw; } 请注意,没有最终的逻辑,catch没有指定任何exception或除了我上面提供的内容之外做任何其他操作。 但是,我知道捕获和重新抛出可以改变exception细节中的调用堆栈。 我不确定的是,这种行为是否特别是因为.NET远程调用。 删除这个try-catch是否安全? 据我所知,它是,但我想我会先检查一下奇怪的行为。

ISponsor和ILease接口如何工作?

我创建了一个inheritanceMarshalByRefObject和ISponsor的对象。 在我的ISponsor实现中,我只返回一个时间跨度来指示我想要更新对象的时间。 当我调用InitializeLifetimeService()来获取要传递到我的ISponsor对象的ILease引用时,它似乎永远不会在我看到的示例中使用。 ISponsor似乎只是在没有实际使用ILease引用的情况下返回TimeSpan。 但我确信这里有更多的事情,因为涉及远程处理。 ISponsor和ILease如何工作,特别是在对象生命周期更新方面?