regasm / codebase работает, но файл, созданный с помощью regasm / codebase / regfile, не работает

У меня есть видимая DLL-библиотека COM, подходящая для 32- и 64-разрядных архитектур, которую я использую для добавления пункта меню в контекстное меню проводника Windows. Используя "regasm myassembly.dll / codebase", я регистрирую dll и вижу новый пункт меню. Здорово. Отмена регистрации тоже работает нормально.

Теперь я хочу создать файл .reg, чтобы добавить этот пункт меню на машины, не предназначенные для разработки. Я использую regasm myassembly.dll / codebase / regfile, который создает файл reg, который я могу импортировать с помощью regedit. Проблема в том, что после импорта .reg я не вижу значок меню. Почему регистрация могла быть неудачной? Обратите внимание, что я использую 64-битную систему.


person Coder1095    schedule 05.04.2013    source источник
comment
Вероятно, 64- или 32-битная штука, см. Также stackoverflow.com/questions/8172392/   -  person AardVark71    schedule 05.04.2013
comment
Я думаю, что это так. Мне нужно будет посмотреть реестр после регистрации с помощью regasm, а затем после использования .reg и посмотреть, в чем различия.   -  person Coder1095    schedule 05.04.2013


Ответы (2)


Регистрация расширения оболочки требует написания большего количества ключей реестра, чем обычно требуется для регистрации сборки [ComVisible] .NET.
Вам также необходимо напишите ключи, которые Explorer читает для обнаружения расширений.
Вы вообще не упомянули, как вы позаботились об этом, обычно для этого требуется собственный [ComRegisterFunction]. Но конечно, файл .reg не будет содержать этих ключей, поскольку для пользовательской функции регистрации требуется запускаемый код.

person Hans Passant    schedule 05.04.2013
comment
Спасибо за ваш вклад. Я использую SharpShell, чтобы позаботиться о неприятная работа, поэтому мне просто нужно зарегистрировать видимую сборку com в этом случае. - person Coder1095; 05.04.2013
comment
Да, у него есть [ComRegisterFunction]. Ясно, что вы не получите ключи, которые он записывает в вашем REG-файле. - person Hans Passant; 05.04.2013

Вы должны знать, что это действительно плохая идея. Прочтите, пожалуйста, этот классический пост на эту тему.

http://blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx

Тогда это недавнее обновление:

http://blogs.msdn.com/b/oldnewthing/archive/2013/02/22/10396079.aspx

Даже если вы настояли на том, чтобы попробовать это (или если сборка предназначалась для чего-то другого, кроме надстройки), все равно использовать файл .reg для регистрации сборки - плохая идея.

Чтобы сборка работала, необходимо сделать еще много чего, помимо регистрации COM. Скорее всего, вам придется добавить его в GAC, чтобы .NET могла его найти. Кроме того, для будущей версии .NET может потребоваться добавление дополнительной информации или другой информации в реестр. Даже сегодня (я подозреваю) REGASM может потребоваться разместить разную информацию в разных средах (x86 или x64).

person Euro Micelli    schedule 05.04.2013
comment
Спасибо за информацию. Есть еще несколько статей об этом здесь, но не все из которых отклонить идею. Файл reg создается самим regasm и должен просто реплицировать изменения, внесенные в реестр инструментом. Также нет необходимости добавлять dll в GAC, поскольку флаг / codebase сохраняет расположение dll в реестре. При этом я рассмотрю альтернативы, так как это оказывается проблематичным. - person Coder1095; 05.04.2013
comment
@Matt, спасибо, что указали на эту ссылку. Это интересное изложение явно противоречивых взглядов. Очевидно, человек провел много исследований. Лично я вынужден полагаться на официальное руководство от MS - которое является официальным по какой-то причине - и на позицию Раймонда Чена, мнение которого я глубоко уважаю. Может быть, в качестве компромисса я могу снять одно из действительно стоящих на моем посту :-) - person Euro Micelli; 06.04.2013