У меня есть исполняемый файл сервера, который разговаривает с Active Directory, чтобы получить информацию о пользователе. Помимо AD, этот exe позволяет клиентам писать свои собственные плагины для общения с пользовательскими каталогами пользователей.Архитектура плагина C# с сильными именами: недоразумение
Этот исполняемый файл имеет сильное имя.
Является ли следующее верное утверждение:
Для того, чтобы сильно по имени сборки, чтобы загрузить другую сборку, то загружен узел должен быть подписан с тем же ключом.
Следующий код возвращает значение null, если сборка не была сильно подписана, без ошибки, указывающей, что сборка была неправильно подписана. Обратите внимание: если я подписываю сборку, я получаю экземпляр IService. Это заставляет меня думать, что загруженные сборки должны быть строго подписаны.
Assembly assembly = Assembly.LoadFrom(path);
foreach (Type t in assembly.GetTypes())
{
if (t.GetInterface(typeof(IService).FullName) != null)
{
return (Activator.CreateInstance(t) as IService);
}
}
Так, значит ли это, если у вас есть сильно подписанная сборка и поддержка сборки плагин, они также должны быть подписаны - плагин авторы должны подписать их с тем же ключом? Это звучит не так.
Наконец, скажем, у меня есть сборка, которая реализует интерфейс IService, но также ссылается на сборку, которая ссылается на еще одну сборку, каждая из которых подписана с другим ключом. Что происходит, когда я пытаюсь загрузить? Должны ли все они быть подписаны одним и тем же ключом?
Но означает ли это, что сборки, загруженные во время выполнения с помощью 'Assembly.LoadFrom()', также должны быть подписаны? Я бы так не подумал. –
@P Папа: yikes, поговорим о пропаже леса для деревьев. Это хороший вопрос - я тоже так не думаю. Фактически, если вы ищете «Assembly.Load Strong Name», вы найдете группу людей, которые спрашивают, как применять сильное требование имени. Теперь я озадачен поведением кода, опубликованного выше. –