#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();
Код прост, но он отлично работает в моем проекте.