Переключатель regAsm regAsm не дает тот же вывод, что и переключатель кодовой базы - PullRequest
5 голосов
/ 17 ноября 2011

Хорошо, я знаю, что это довольно специфично, но я потерял весь свой рабочий день, поэтому мне действительно нужно какое-то рациональное объяснение, чтобы мой босс и моя жена не уволили меня

Согласно MSDN:
Переключатель /regfile «Генерирует указанный файл .reg для сборки»
Переключатель /codebase «Создает запись Codebase в реестре, указывающую путь к файлу для сборки»

Я догадался, что это были 2 разных способа делать одно и то же.Правда была, я ошибался:

МЕТОД 1

C:\>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\SERVER.dll" /regfile
Registry script 'C:\SERVER.reg' generated successfully

Reg Вывод файла:

REGEDIT4

[HKEY_CLASSES_ROOT\xfeed.server.X]
@="SERVER.XLS"

[HKEY_CLASSES_ROOT\xfeed.server.X\CLSID]
@="{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}"

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}]
@="SERVER.XLS"

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="SERVER.XLS"
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32\1.0.0.0]
"Class"="SERVER.XLS"
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\ProgId]
@="xfeed.server.X"

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories\        {62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

МЕТОД 2

Но когда я выполняю команду переключения кодовой базы напрямую, а не через reg-файл, ключи, на которые воздействует регистр, отличаются (и работают, в отличие от предыдущего вывода)

C:\>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\SERVER.dll" /codebase
Types registered successfully

Реестр реестра с кодовой базой:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}]
@="SERVER.XLS"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="SERVER.XLS"
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/SERVER.DLL"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32\1.0.0.0]
"Class"="SERVER.XLS"
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/SERVER.DLL"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\ProgId]
@="xfeed.server.X"




Как вы можете заметить, материал теперь находится в Wow6432Node , и информация гораздо более полна (особенноCodeBase !!!)

Если бы кто-нибудь мог дать мне разумную причину этого, чтобы я не упомянул паранормальную активность как причину потерянного рабочего дня, я был бы очень признателен

1 Ответ

8 голосов
/ 18 ноября 2011

Флаг codebase сообщает regasm, что вы хотите зарегистрировать DLL со ссылкой на фактическое местоположение файла.Это полезно, если у вас есть dll, хранящаяся с развернутым приложением, и вы не хотите, чтобы она была в GAC.Без использования этого флага вы должны поместить свою DLL в GAC для ее полной функциональности.

Флаг regfile сообщает regasm, что вы хотите вывести файл реестра INSTEAD для фактической регистрации библиотеки DLL.

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

РЕДАКТИРОВАТЬ: дальнейшее объяснение на основена ваш комментарий.

RegAsm обычно регистрирует основную информацию о .dll, потому что предполагается, что он будет загружен в GAC.Все в GAC регистрируется таким образом, чтобы система могла контролировать и загружать сборку в память.Когда вы работаете в 32-битной системе и используете флаг codebase, он почти напрямую добавляет ключ значения «codebase» к ключам реестра, где определена сборка, а затем устанавливает значение этого в путь, где физически расположен файл .dll.

При регистрации таким образом он в основном сообщает компьютеру и всем, кто хочет использовать сборку, где он может найти код, и как загрузить его в память.Иногда это приводит к тому, что дополнительные ключи выходят за рамки того, что нужно GAC, чтобы вызывающий процесс знал лучший способ доступа к сборке.

Теперь, поскольку вы работаете в 64-битной системе, вы сталкиваетесь с дополнительной проблемой.Существуют правила для разделения 32-битных и 64-битных приложений по всему компьютеру.Вот почему есть 2 папки с программными файлами и почему в реестре есть раздел wow32.Если регистрируется 32-битная dll, ее нужно сохранить в этом разделе реестра, когда это делается с флагом / codebase, чтобы 32-битные приложения могли ее найти (это единственная часть реестра, к которой у них есть доступ).Если бы это был 64-битный dll, он не должен был бы находиться в этой части реестра.

Теперь, из-за этой информации, если вы используете выходные данные файла для записи части сценария реестраустановщик, вы захотите проверить целевой компьютер, чтобы определить, должна ли информация находиться в разделе wow пользователей или в обычном разделе реестра, и внести соответствующие изменения в этот сценарий перед его запуском.

...