Десериализовать объект (dll-класс) - PullRequest
1 голос
/ 31 октября 2011

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

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

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

Ответы [ 3 ]

0 голосов
/ 31 октября 2011

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

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

0 голосов
/ 31 октября 2011

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

В моем случае выполнение сборки и плагина находятся в одной папке, но я исключение "Сборка ... не может быть найдена" - throwЯ написал следующий класс

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();

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

0 голосов
/ 31 октября 2011

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

...