【发布时间】:2011-11-17 18:34:59
【问题描述】:
好的,我知道这很具体,但是我为此浪费了整个工作日,所以我真的需要一些合理的解释,所以我的老板和我的妻子不会解雇我
根据 MSDN :/regfile 开关“为程序集生成指定的 .reg 文件”/codebase 开关“在注册表中创建一个 Codebase 条目,指定程序集的文件路径”
我猜这是做同样事情的两种不同方式。事实是,我错了:
方法一
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 !!!)
如果有人能给我一个合理的理由,这样我就可以避免将超自然活动作为失去工作日的原因,我将非常感激
【问题讨论】:
-
我在注册程序集时遇到问题,这是由于使用 32 位 RegAsm 而不是 64 位版本。尝试使用相同的 /Codebase 参数在这两个工具中注册它,看看是否有帮助。
-
理由是什么?这都是正常的。在您的开发机器上使用 /codebase 并使用正确版本的 regedit.exe 将 .reg 文件播放到注册表中。 c:\windows\syswow64\regedit.exe 用于 32 位 COM 服务器。除了启动安装程序之外,使用 regfile 没什么意义。
-
@HansPassant :使用 regfile 是有道理的,因为我想创建一个明确的安装脚本,而不是在客户端机器上调用 RegAsm 进行部署,另外,我想知道注册表项“代码库”到底是什么生成。