2011-11-17 8 views
5

Ok, so che questo è piuttosto specifico, ma ho perso tutta la giornata lavorativa su di esso quindi ho davvero bisogno di qualche spiegazione razionale, quindi il mio capo e mia moglie non lo farebbero licenziarmi
L'interruttore regafile RegAsm non fornisce lo stesso output dell'interruttore codebase

Secondo MSDN:
l'interruttore /regfile "genera il file reg specificato per il montaggio"
l'interruttore /codebase "crea una voce Codebase nel registro specifiying il percorso del file per un assembly"

Ho intuito che c'erano 2 modi diversi di fare il stessa cosa La verità era, mi sbagliavo:

METODO 1

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

Reg uscita File:

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

METODO 2

Ma quando eseguo direttamente il comando di commutazione codebase piuttosto che usando il file reg, le chiavi hanno avuto impatto nella r egsitry sono diverse (e di lavoro, al contrario dell'uscita precedente)

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

ouptut Registro con codice di 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" 




Come si può notare, roba è ora nel Wow6432Node e le informazioni sono molto più complete (in particolare CodeBase !!!)

Se qualcuno potesse darmi un motivo razionale per questo, quindi Potrei evitare di menzionare l'attività paranormale come causa di una giornata lavorativa persa, sarei molto grato

+0

Si è verificato un problema durante la registrazione degli assembly dovuti all'utilizzo del RegAsm a 32 bit anziché della versione a 64 bit. Prova a registrarlo con entrambi gli strumenti, usando lo stesso parametro/Codebase, e vedi se questo aiuta. –

+0

Una logica per cosa? Questo è tutto normale. Usa/codebase sulla tua macchina dev e riproduci i file .reg nel registro con la versione corretta di regedit.exe. c: \ windows \ syswow64 \ regedit.exe per un server COM a 32 bit. Poco importa usare un regfile diverso dall'avvio di un programma di installazione. –

+0

@HansPassant: C'è un punto che utilizza regfile perché volevo creare uno script di installazione esplicita piuttosto che chiamare RegAsm sui computer client per l'implementazione, inoltre, volevo sapere esattamente quali voci del registro "codebase" stavano generando. –

risposta

8

Il flag codebase indica al regasma che si desidera registrare una DLL con un riferimento alla posizione effettiva del file. Questo è utile se hai una DLL che viene archiviata con un'applicazione distribuita e non la vuoi nel GAC. Senza utilizzare questo flag è necessario inserire la DLL nel GAC per la sua piena funzionalità.

Il flag regfile indica al regasm che si desidera generare un file di registro INSTEAD che registra effettivamente la dll.

Questi possono essere usati insieme se si desidera un output di file di registro che contenga anche i dati per una posizione di dll diversa dal registro e penso che si stesse ipotizzando che si trattasse di una situazione o.

MODIFICA: ulteriore spiegazione basata sul tuo commento.

RegAsm registra in genere le informazioni di base su un dll perché si presuppone che verrà caricato nel GAC. Tutto ciò che è contenuto nel GAC è registrato in un modo che consente al sistema di controllare e caricare l'assembly in memoria. Quando si utilizza un sistema a 32 bit e si utilizza il flag codebase, esso aggiunge quasi direttamente la chiave del valore "codebase" alle chiavi del Registro di sistema in cui è definito l'assembly, quindi imposta il valore di questo nel percorso in cui si trova fisicamente .dll.

Registrato in questo modo, in pratica dice al computer e a tutto ciò che cerca di utilizzare l'assembly in cui è possibile trovare il codice e come caricarlo in memoria. A volte ciò causa chiavi extra oltre a quelle necessarie al GAC, in modo che un processo chiamante conosca il modo migliore per accedere all'assembly.

Ora, dal momento che ci si trova su un sistema a 64 bit, si deve affrontare una sfida aggiuntiva. Esistono regole per mantenere le applicazioni a 32 bit e 64 bit separate in tutto il computer. Questo è il motivo per cui esistono 2 cartelle di programmi e perché il registro ha la sezione wow32. Se una DLL a 32 bit viene registrata, deve essere archiviata in questa sezione del registro quando viene eseguita con il flag/codebase in modo che le applicazioni a 32 bit possano trovarla (questa è l'unica parte del registro a cui hanno accesso). Se fosse una dll a 64 bit, non avrebbe bisogno di essere in questa parte del registro.

Ora, a causa di queste informazioni, se si sta utilizzando l'output del file per scrivere una porzione di script del registro di un programma di installazione, si vorrà controllare la macchina di destinazione per determinare se le informazioni devono essere presenti negli utenti wow sezione, o sezione normale del registro, e apportare le modifiche appropriate a questo script prima di eseguirlo.

+0

Holy Cow. In questo modo, le cose sono molto più chiare. Howdya sa che amico? MSDN non è molto esplicito su questo punto, quindi mi sono davvero confuso. Fondamentalmente, ho usato l'interruttore regfile solo per VEDERE effettivamente ciò che fa effettivamente il codice base. Ma credo di essermi sbagliato. C'è un modo per farlo? –

+0

Non sei sicuro di cosa intendi vedendo quello che fa, ma cercherò di spiegare quello che penso tu stia chiedendo. – Nikkoli

Problemi correlati