2011-11-17 37 views
5

好吧,我知道這是非常具體的,但我失去了我的整個工作日,所以我真的需要一些理性的解釋,所以我的老闆和我的妻子不會消防箱
RegAsm regfile開關沒有給出與codebase開關相同的輸出

根據MSDN:
/regfile開關「生成指定的.reg文件彙編」
/codebase開關「創建註冊表specifiying文件路徑組件代碼庫條目」

我猜測這是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文件, 在r中影響的鍵egsitry是不同的(和工作,在前面的輸出的相反)

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

註冊ouptut與基本代碼:

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 and infos are more more comprehensive(especially CodeBase !!!)

如果有人能給我一個理性的理由,所以我可以避免提到超自然活動作爲失去工作日的原因,我將非常感謝

+0

我有一個註冊程序集的問題,這是因爲使用32位RegAsm而不是64位版本。嘗試使用這兩個工具註冊它,使用相同的/ Codebase參數,看看是否有幫助。 –

+0

什麼理由?這很正常。使用您的開發機器上的/ codebase並使用正確版本的regedit.exe將.reg文件回放到註冊表中。 c:\ windows \ syswow64 \ regedit.exe 32位COM服務器。使用除獲取安裝程序以外的regfile的一點點。 –

+0

@HansPassant:有一點需要使用regfile,因爲我想創建一個明確的安裝腳本,而不是在客戶端機器上調用RegAsm進行部署,另外,我想確切地知道註冊表項「codebase」的生成過程。 –

回答

8

代碼庫標誌告訴regasm你想註冊一個DLL文件的實際位置的引用。如果您有一個dll被存儲在已部署的應用程序中,而您不希望它在GAC中,那麼這非常有用。如果不使用此標誌,則必須將您的DLL放入GAC以獲取其全部功能。

regfile標誌告訴regasm你想輸出一個註冊表文件INSTEAD實際註冊dll。

這些可以一起使用,如果你想要一個註冊表文件的輸出,也包含註冊表以外的dll位置的數據,我想你是假設它是一個任意或情況。

編輯:根據您的評論進一步解釋。

RegAsm通常會記錄有關.dll的基本信息,因爲它假定它將被加載到GAC中。 GAC中的任何內容都是以允許系統控制並將程序集加載到內存中的方式註冊的。當您使用32位系統並使用代碼庫標誌時,它幾乎直接將「代碼庫」值鍵添加到定義程序集的註冊表項中,然後將其值設置爲.dll物理位置所在的路徑。

當以這種方式註冊時,它基本上告訴計算機和任何想要使用程序集的地方,它可以找到代碼,以及如何將它加載到內存中。有時這會導致超出GAC所需的額外密鑰,以致調用進程知道訪問程序集的最佳方式。

現在,由於您使用的是64位系統,因此您將面臨額外的挑戰。有一些規則可以使32位和64位應用程序在整個計算機中保持分離。這就是爲什麼有2個程序文件夾,以及爲什麼註冊表有wow32部分。如果一個32位dll被註冊,它需要存儲在註冊表的這一部分,當它完成/ codebase標誌,以便32位應用程序可以找到它(這是他們有權訪問的註冊表的唯一部分)。如果它是一個64位的DLL,它不需要在註冊表的這一部分。

現在,由於這些信息,如果您使用文件的輸出來編寫安裝程序的註冊表腳本部分,您將需要檢查目標機器以確定信息是否需要在用戶哇部分或註冊表的正常部分,並在運行此腳本之前對其進行適當更改。

+0

聖牛。換句話說,事情就更清楚了。 Howdya知道Buddy? MSDN在這一點上不是非常明確,所以我真的很困惑。基本上,我使用regfile開關只是爲了實際查看代碼庫swtich實際上做了什麼。但我想我錯了。有沒有辦法做到這一點 ? –

+0

不知道你的意思是看到它的作用,但我會試着解釋我認爲你在問什麼。 – Nikkoli