Сервер SharpShell.dll НЕ подписан
Мне нужно разработать расширение контекстного меню оболочки, которое ссылается на некоторые другие пользовательские сборки... Я не хочу назначать ключ строгого имени этим пользовательским сборкам!
Руководство, которому я следовал, чтобы сделать это, использует проект SharpShell и иллюстрирует, как подписать (но не объясняет почему) сборку... и это моя проблема: если я подпишу свой окончательный.dll, то у меня будет много ошибок во время сборки моего проекта фаза, потому что у некоторых сборок ссылки на мои проекты не имеют строгого имени ("Ссылочная сборка не имеет строгого имени").
В общем, поиск в Google по поводу реализации расширения C# Shell, все лучшие учебники, которые я нашел, подписывают окончательную сборку... это обязательно?
Без подписи сборки ServerManager.exe возвращает эту ошибку:The file 'XYZ.dll' is not a SharpShell Server
".
2 ответа
Наконец я решил свои проблемы... SharpShell.dll
файл, полученный через NuGet, был другой версией ServerManager.exe
из них. Моим решением было удаление пакета SharpShell NuGet и прямая ссылка на файл SharpShell.dll, находящийся в папке ServerManager!
Кроме того, я искал между комментариями к статье... пожалуйста, прочитайте этот вопрос.
Вам не нужно использовать старую DLL. Пожалуйста, используйте этот код напрямую, без использования ServerManager.exe.
private static ServerEntry serverEntry = null;
public static ServerEntry SelectedServerEntry
{
get
{
if (serverEntry == null)
serverEntry = ServerManagerApi.LoadServer("xxx.dll");
return serverEntry;
}
}
public static ServerEntry LoadServer(string path)
{
try
{
// Create a server entry for the server.
var serverEntry = new ServerEntry();
// Set the data.
serverEntry.ServerName = Path.GetFileNameWithoutExtension(path);
serverEntry.ServerPath = path;
// Create an assembly catalog for the assembly and a container from it.
var catalog = new AssemblyCatalog(Path.GetFullPath(path));
var container = new CompositionContainer(catalog);
// Get the exported server.
var server = container.GetExport<ISharpShellServer>().Value;
serverEntry.ServerType = server.ServerType;
serverEntry.ClassId = server.GetType().GUID;
serverEntry.Server = server;
return serverEntry;
}
catch (Exception)
{
// It's almost certainly not a COM server.
MessageBox.Show("The file '" + Path.GetFileName(path) + "' is not a SharpShell Server.", "Warning");
return null;
}
}
Установить код:
ServerRegistrationManager.InstallServer(SelectedServerEntry.Server, RegistrationType.OS64Bit, true);
Регистрационный код:
ServerRegistrationManager.RegisterServer(SelectedServerEntry.Server, RegistrationType.OS64Bit);