Сервер 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);
Другие вопросы по тегам