2011-11-17 6 views
5

Ok, sé que esto es bastante específico, pero perdí todo mi día de trabajo así que realmente necesito una explicación racional, así que mi jefe y mi esposa no despedirme
RegAsm regfile switch no da la misma salida que Codebase Switch

de acuerdo con MSDN:
el interruptor /regfile "genera el archivo .reg especificado para el montaje de"
el interruptor /codebase "crea una entrada de código base en el registro especificando la ruta del archivo para un conjunto de"

Supuse que eran 2 maneras diferentes de hacer el lo mismo. La verdad era que yo estaba equivocado:

MÉTODO 1

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

Reg salida del archivo:

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}] 

MÉTODO 2

Pero cuando ejecuto el comando interruptor de código base directamente en lugar de utilizar el archivo reg, las teclas afectadas en el r egsitry son diferentes (y el trabajo, por el contrario de la salida anterior)

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

ouptut del registro con el código base:

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" 




Como se puede notar, las cosas se encuentra ahora en la Wow6432Node y las informaciones son mucho más exhaustivas (notablemente CodeBase !!!)

Si alguien pudiera darme una razón racional para esto, entonces podría evitar mencionar la actividad paranormal como causa de una jornada laboral perdida, estaría muy agradecido

+0

tuve un problema al registrar ensamblados que era debido al uso de la RegAsm de 32 bits en lugar de la versión de 64 bits. Intente registrarlo con ambas herramientas, usando el mismo parámetro/Codebase y vea si eso ayuda. –

+0

¿Una razón para qué? Esto es todo normal. Use/codebase en su máquina dev y reproduzca archivos .reg en el registro con la versión correcta de regedit.exe. c: \ windows \ syswow64 \ regedit.exe para un servidor COM de 32 bits. Un pequeño punto en el uso de un regfile que no sea iniciar un instalador. –

+0

@HansPassant: Hay un punto usando regfile ya que quería crear una instalación explícita una secuencia de comandos en lugar de llamar RegAsm en las máquinas cliente para su despliegue, además, quería saber exactamente lo que estaba generando entradas de registro "código base". –

Respuesta

8

La bandera de la base de código le dice a regasm que desea registrar una DLL con una referencia a la ubicación real del archivo. Esto es útil si tiene un archivo DLL almacenado con una aplicación implementada y no lo quiere en el GAC. Sin usar este indicador, debe poner su DLL en el GAC para su funcionalidad completa.

La bandera de regfile le dice a regasm que desea generar un archivo de registro EN VEZ de registrar realmente el dll.

Se pueden usar juntos si desea una salida de archivo de registro que también contenga los datos de una ubicación dll que no sea el registro, y creo que suponía que era una situación cualquiera.

EDIT: explicación adicional basada en su comentario.

RegAsm normalmente registra la información básica sobre un .dll porque se supone que se cargará en el GAC. Cualquier cosa en el GAC se registra de una manera que permite que el sistema controle y cargue el ensamblaje en la memoria. Cuando se encuentra en un sistema de 32 bits y usa el indicador de base de código, casi directamente agrega la clave de valor "codebase" a las claves de registro donde se define el ensamblaje, luego establece el valor de esto en la ruta donde se encuentra físicamente el .dll.

Cuando registrada de esta manera, que básicamente le dice al ordenador y todo lo que buscan utilizar la asamblea donde se puede encontrar el código, y cómo cargarlo en la memoria. A veces, esto causa claves adicionales más allá de lo que el GAC necesitaría para que un proceso de llamada sepa la mejor manera de acceder al ensamblado.

Ahora, ya que estás en un sistema de 64 bits, que se enfrentan a un reto adicional. Existen reglas para mantener separadas las aplicaciones de 32 bits y de 64 bits en toda la computadora. Es por eso que hay 2 carpetas de archivos de programa y por qué el registro tiene la sección wow32. Si un DLL de 32 bits obtiene registrado, tiene que ser almacenado en esta sección del registro cuando se hace con la bandera/código base para que las aplicaciones de 32 bits pueden encontrarlo (esta es la única parte del registro que tengan acceso a) Si fuera un dll de 64 bits, no necesitaría estar en esta parte del registro.

Ahora, debido a esta información, si está utilizando la salida del archivo para escribir una parte del script de registro de un instalador, querrá verificar la máquina de destino para determinar si la información debe estar en los usuarios wow sección, o sección normal del registro, y realice el cambio apropiado a este script antes de ejecutarlo.

+0

Holy Cow. Dicho de esta manera, las cosas están mucho más claras. Howdya sabe que Buddy ??? MSDN no es muy explícito en ese punto, así que realmente me confundí. Básicamente, utilicé el modificador regfile solo para VER realmente lo que la base de código realmente hace. Pero creo que estaba equivocado. Hay una manera de hacer eso ? –

+0

No está seguro de lo que entendemos por ver lo que hace, pero voy a tratar de explicar lo que pienso que usted está pidiendo. – Nikkoli