Распространение пользовательских исключений в .NET Remoting завершается ошибкой с TargetInvocationException, говорящим «не удалось загрузить файл или сборку» - PullRequest
0 голосов
/ 11 октября 2010

У меня есть клиент-серверное приложение, которое использует .NET Remoting для связи.Это разделено интерфейсом, и клиент не ссылается на реализацию сервера.Теперь пользовательское исключение в совместно используемой dll, когда выбрасывается с сервера, не перехватывается клиентом и вызывает исключение TargetInvocationException, говорящее «Не удалось загрузить файл или сборку [Server Assembly]».Проблема решается, если я копирую серверную сборку на клиент.Немного странно, что это происходит, учитывая, что сборка сервера даже не содержит тип исключения, и я не хочу копировать сборку реализации сервера на клиент.

В двух словах:

ClientAssembly -> CommonAssembly, InterfaceAssembly
ServerAssembly -> CommonAssembly, InterfaceAssembly

(в общей сборке)

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

Это будетбыть действительно полезным, если есть обходной путь для этого.Кроме того, если кто-то может пролить свет на то, почему требуется сборка, даже если тип был предоставлен в общий доступ.Как ни странно, эта проблема не возникает, если я использую System.Exception

1 Ответ

1 голос
/ 12 октября 2010

Я решил проблему за один раз.При создании MyException были некоторые данные, которые создавали проблему во время сериализации.До сих пор не смог понять, что это было бы (так как я инициализировал с простой строкой).Тем не менее, я написал тестовое приложение, чтобы попробовать это, и оно работало с простым исключением.На данный момент я создал отдельное исключение для решения этой проблемы.Во время сериализации я не вызываю base.GetObjectData.Я могу вернуть его в этом случае.Мой base.GetObjectData использует FormatterServices, чтобы выяснить сериализуемые поля и заполнить их.Некоторые данные внутри, кажется, вызывают проблему.

Спасибо за помощь:)

...