Я использую Emit для создания некоторых динамических типов в моем проекте, особенно для замены «Декораторов» вокруг моих сервисных интерфейсов.
Я также делаю это для класса, зарегистрированного в .Net Remoting как WellKnownServiceType. Однако, .Net Remoting, похоже, не очень хорошо работает с динамически генерируемыми типами.
Сначала я получил:
System.IO.FileNotFoundException: Could not load file or assembly 'Dynamic, Version=0.0.0.0, Culture=neutral, PublicKeyToken=XXXX' or one of its dependencies. The system cannot find the file specified.
Конечно, файл не существует, сборка динамическая, и я установил для Emit только «Выполнить» сборку, но не SaveAndRun.
Итак, перед регистрацией типа я вызываю Assembly.Load (type.Assembly.GetName ()).
Теперь я получаю:
System.Runtime.Remoting.RemotingException: Requested Service not found
Server stack trace:
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
Ошибка появляется только на стороне клиента как исключение из сервера. Я не вижу ошибок в журналах сервера.
Кто-нибудь знает, является ли это «общеизвестной» проблемой, что динамические типы нельзя использовать для размещения служб удаленного взаимодействия .net?
Любые подсказки или указатели, чтобы обойти это?
** ОБНОВЛЕНИЕ ****
Я перестал использовать Emit. Emit заставил меня добавить атрибут «InternalsVisibleTo» в мои основные сборки, что серьезно повлияло на запутывание. Скорее я переключился на генерацию кода с использованием пространства имен CodeDom. Работает красиво. Я вижу фактический исходный код, который выполняет эту работу, что очень полезно при отладке.