Regasm не работает с dll

Я создаю расширение оболочки IconHandler в С#, используя SharpShell. Вот код моей dll.

using SharpShell.Attributes;
using SharpShell.SharpIconHandler;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace DllIconHandler
{
    [ComVisible(true)]
    [COMServerAssocation(AssociationType.ClassOfExtension, ".jxe")]
    public class DllIconHandler : SharpIconHandler
    {
        protected override Icon GetIcon(bool smallIcon, uint iconSize)
        {
            Icon icon = null;
            FileInfo file = new FileInfo(SelectedItemPath);
            long size = file.Length;

            if (size > 0)
            {
                icon = new Icon("C:\\Users\\Owner\\Desktop\\icon1.ico");
            }
            else
            {
                icon = new Icon("C:\\Users\\Owner\\Desktop\\icon2.ico");
            }

            return GetIconSpecificSize(icon, new Size((int)iconSize, (int)iconSize));
        }
    }
}

Я встроил это в dll и перенес dll на свой рабочий стол. Затем я запустил regasm в dll, используя следующие команды в командной строке от имени администратора.

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe C:\Users\Owner\Desktop\DllIconHandler.dll /codebase

Но когда я это делаю, появляется ошибка

RegAsm : error RA0000 : An error occurred inside the user defined Register/Unreg
ister functions: System.InvalidOperationException: Cannot open default icon key
for class jxe_auto_file
   at SharpShell.ServerRegistration.ServerRegistrationManager.SetIconHandlerDefa
ultIcon(RegistryKey classesKey, String className)
   at SharpShell.ServerRegistration.ServerRegistrationManager.RegisterServerAsso
ciations(Guid serverClsid, ServerType serverType, String serverName, Association
Type associationType, IEnumerable`1 associations, RegistrationType registrationT
ype)
   at SharpShell.SharpShellServer.DoRegister(Type type, RegistrationType registr
ationType)

Похоже, что-то не так в реестре.


person Popgalop    schedule 02.09.2013    source источник
comment
Ошибка при попытке открыть раздел реестра. Отчеты об ошибках в таких библиотеках, как правило, так себе, не очень понятно, почему он не сообщил об ошибке при создании ключа. Возможно, вы должны сами создать ассоциацию файлов, прежде чем пытаться зарегистрировать компонент. Убедитесь, что вы запускаете Regasm из командной строки с повышенными привилегиями.   -  person Hans Passant    schedule 02.09.2013
comment
я запускал через запуск от имени администратора   -  person Popgalop    schedule 02.09.2013
comment
Ну, у вас есть исходный код, так что вы можете просто отладить его. Запустите VS с повышенными правами, Project + Properties, вкладка Debug. Запустите внешнюю программу и введите командную строку Regasm.exe. Установите точку останова на DoRegister().   -  person Hans Passant    schedule 02.09.2013
comment
но у меня нет источника для DoRegister()   -  person Popgalop    schedule 02.09.2013
comment
Конечно, вы знаете, SharpShell — это проект с открытым исходным кодом.   -  person Hans Passant    schedule 02.09.2013
comment
почему та же проблема все еще будет возникать, и у меня все еще будет та же информация   -  person Popgalop    schedule 03.09.2013


Ответы (1)


Запись в вашем реестре должна выглядеть так:

HKEY_CLASSES_ROOT
jxe_auto_file
DefaultIcon: (по умолчанию) (путь к значку)

Я почти уверен, что в вашей записи jxe_auto_file не было «DefaultIcon».

person Eledra Nguyen    schedule 20.01.2015