C# .NET远程处理中的自定义异常传播失败,目标异常为“0”;无法加载文件或程序集“;
我有一个客户端服务器应用程序,它使用.NET远程通信进行通信。这由一个接口分隔,客户端不引用服务器的实现。现在,当从服务器抛出时,共享dll中的自定义异常不会被客户端捕获,并抛出一个TargetInvocationException,表示“无法加载文件或程序集[server assembly]”。如果我将服务器程序集复制到客户端,问题就解决了。 考虑到服务器程序集甚至不包含异常类型,并且我不想将服务器实现程序集复制到客户端,这种情况会发生,这有点奇怪 简言之:C# .NET远程处理中的自定义异常传播失败,目标异常为“0”;无法加载文件或程序集“;,c#,.net,exception,remoting,C#,.net,Exception,Remoting,我有一个客户端服务器应用程序,它使用.NET远程通信进行通信。这由一个接口分隔,客户端不引用服务器的实现。现在,当从服务器抛出时,共享dll中的自定义异常不会被客户端捕获,并抛出一个TargetInvocationException,表示“无法加载文件或程序集[server assembly]”。如果我将服务器程序集复制到客户端,问题就解决了。 考虑到服务器程序集甚至不包含异常类型,并且我不想将服务器实现程序集复制到客户端,这种情况会发生,这有点奇怪 简言之: ClientAssembly -&
ClientAssembly -> CommonAssembly, InterfaceAssembly
ServerAssembly -> CommonAssembly, InterfaceAssembly
(共同装配)
(在服务器程序集中)
(在客户端程序集中)
如果有一个解决方法,这将是非常有帮助的。此外,如果有人能够解释为什么即使类型已共享,也需要程序集。奇怪的是,如果我使用系统,这个问题就不会发生。异常我已经解决了这个问题一次。在创建MyException时,有一些数据在序列化过程中产生了问题。仍然无法弄清楚这会是什么(因为我是用一个简单的字符串初始化的)。然而,我编写了一个测试应用程序来尝试这一点,它在一个简单的异常下工作。现在,我已经创建了一个单独的例外来处理这个问题。在序列化过程中,我确保不调用base.GetObjectData。在这种情况下,我能抓住它。 My base.GetObjectData使用FormatterServices找出可序列化字段并填充它们。内部的一些数据似乎是导致问题的原因
感谢您的帮助:)如何创建serverObject?我假设没有服务器对象泄漏到事件中,例如自定义事件属性、事件等?您的异常是否包含内部异常?@lucero-不,它不包含可能在序列化过程中产生问题的内部异常。我用一个简单的消息字符串进行了尝试。@lkaso-服务器对象是使用Activator.GetObject()创建的。客户端程序集仅引用接口程序集@马克-不,我尝试了一个简单的例外,没有任何这样的数据
class MyException : Exception, ISerializable (this is implemented properly)
{ }
class MyServer
{
public void MyFunc()
{
throw new MyException("custom message");
}
}
class MyClient
{
public void MyFunc()
{
try { serverObject.MyFunc() } catch(MyException e) { // doesn't get caught. }
}
}