Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET远程处理中的自定义异常传播失败,目标异常为“0”;无法加载文件或程序集“;_C#_.net_Exception_Remoting - Fatal编程技术网

C# .NET远程处理中的自定义异常传播失败,目标异常为“0”;无法加载文件或程序集“;

C# .NET远程处理中的自定义异常传播失败,目标异常为“0”;无法加载文件或程序集“;,c#,.net,exception,remoting,C#,.net,Exception,Remoting,我有一个客户端服务器应用程序,它使用.NET远程通信进行通信。这由一个接口分隔,客户端不引用服务器的实现。现在,当从服务器抛出时,共享dll中的自定义异常不会被客户端捕获,并抛出一个TargetInvocationException,表示“无法加载文件或程序集[server assembly]”。如果我将服务器程序集复制到客户端,问题就解决了。 考虑到服务器程序集甚至不包含异常类型,并且我不想将服务器实现程序集复制到客户端,这种情况会发生,这有点奇怪 简言之: ClientAssembly -&

我有一个客户端服务器应用程序,它使用.NET远程通信进行通信。这由一个接口分隔,客户端不引用服务器的实现。现在,当从服务器抛出时,共享dll中的自定义异常不会被客户端捕获,并抛出一个TargetInvocationException,表示“无法加载文件或程序集[server assembly]”。如果我将服务器程序集复制到客户端,问题就解决了。 考虑到服务器程序集甚至不包含异常类型,并且我不想将服务器实现程序集复制到客户端,这种情况会发生,这有点奇怪

简言之:

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. }
  }
}