RegAsm的regfile开关和代码库开关输出不一样

本文关键字:开关 输出 不一样 代码 regfile RegAsm | 更新日期: 2023-09-27 18:14:54

好吧,我知道这很具体,但是我浪费了一整天的工作时间,所以我真的需要一些合理的解释,这样我的老板和我的妻子就不会解雇我了

根据MSDN:
/regfile开关"为程序集生成指定的.reg文件"
/codebase开关"在注册表中创建一个代码库条目,指定程序集的文件路径"

我猜这是做同一件事的两种不同方式。事实是,我错了:

方法1

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

文件输出:

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

但是当我直接执行cobaseswitch命令而不是使用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 !!)

如果有人能给我一个合理的理由,这样我就可以避免把超自然活动作为失去工作日的原因,我将非常感激

RegAsm的regfile开关和代码库开关输出不一样

codebase标志告诉regasm,您想注册一个带有对文件实际位置的引用的DLL。如果您有一个dll与已部署的应用程序一起存储,并且您不希望它在GAC中,则此功能非常有用。如果不使用此标志,您必须将DLL放入GAC中以获得其全部功能。

regfile标志告诉regasm你想输出一个注册表文件,而不是实际注册dll。

这些可以一起使用,如果你想要一个注册表文件输出,也包含一个dll位置的数据,而不是注册表,我想你是假设这是一个非选或情况。

编辑:根据你的评论进一步解释。

RegAsm通常注册关于.dll的基本信息,因为假设它将被加载到GAC中。GAC中的任何东西都以一种允许系统控制和加载汇编到内存的方式进行注册。当您在32位系统上并使用codebase标志时,它几乎直接将"codebase"valuekey添加到定义程序集的注册表项中,然后将此值设置为.dll物理位置的路径。当以这种方式注册

时,它基本上告诉计算机和任何想要使用程序集的东西在哪里可以找到代码,以及如何将其加载到内存中。有时这会导致超出GAC所需的额外键,以便调用进程知道访问程序集的最佳方法。

现在,由于您使用的是64位系统,您将面临额外的挑战。有一些规则可以将32位和64位应用程序在整个计算机中分开。这就是为什么有2个程序文件文件夹,以及为什么注册表有wow32部分。如果注册了一个32位的dll,那么当使用/codebase标志完成后,它需要存储在注册表的这一部分中,以便32位应用程序可以找到它(这是它们可以访问的注册表的唯一部分)。如果它是一个64位的dll,它就不需要在注册表的这一部分。

现在,由于这些信息,如果您正在使用该文件的输出来编写安装程序的注册表脚本部分,那么您将需要检查目标机器,以确定这些信息是否需要在注册表的users wow部分或normal部分中,并在运行该脚本之前对其进行适当的更改。