Десериализация объекта (dll-класса)

#c# #serialization #plugins #dll

#c# #сериализация #Плагины #dll

Вопрос:

У меня проблема с моими dll-файлами. Я пишу программу, которая может быть расширена с помощью некоторых плагинов. Я использую интерфейс для этих плагинов, и я могу читать и использовать их в своей программе. Каждый плагин содержит сериализуемый класс, который содержит несколько простых полей. Я могу сериализовать эти классы с помощью двоичного форматирования и сохранить их на диск. Но когда я пытаюсь десериализовать свой сохраненный файл, я получаю исключение: «Сборка … не может быть найден «.

Где я должен зарегистрировать свои dll-плагины, чтобы моя программа могла найти сборку?

Спасибо за помощь!

Ответ №1:

Прежде всего, я настоятельно рекомендую использовать MEF для плагина, он является частью .NET 4.0.

С другой стороны, библиотеки DLL загружаются из папки bin. Если вы поместите их в другое место, они не могут быть найдены. Теперь, если вы все еще настаиваете на наличии подпапки «plugin» внутри вашей корзины, вы можете вручную загружать сборки при запуске с помощью Assembly.LoadFile .

Комментарии:

1. Привет. Когда мой dll-файл сохраняется в папке bin, сборка может быть найдена. Но мы должны использовать специальную папку для плагинов. Я попробовал «Сборку. LoadFrom()» тоже, но это не помогло. Я получаю объект Assembly, который сообщает мне много разных вещей, таких как другие интерфейсы, но двоичный форматер по-прежнему не знает сборку : (

2. Assembly.LoadFrom будет работать, но проблема в том, что библиотеки DLL могут иметь зависимости, и вам, возможно, придется также поместить зависимости в папку плагина.

Ответ №2:

Убедитесь, что dll плагина и все его зависимости находятся в одном каталоге (или GAC).

Ответ №3:

Посмотрите здесь http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/e5f0c371-b900-41d8-9a5b-1052739f2521

В моем случае исполняемая сборка и сборка плагина находятся в одной папке, но я исключаю «сборку… не может быть найден» — это выброс.

Я написал следующий класс

 internal class FromLoadedAssemblyBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {            
            Assembly assembly = Assembly.Load(assemblyName);
            return assembly.GetType(typeName);
        }
    }
 

и использование

 _binaryFormatter = new BinaryFormatter();
_binaryFormatter.Binder = new FromLoadedAssemblyBinder();
 

Код прост, но он отлично работает в моем проекте.