2011-11-17 39 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