RegAsm regfile开关没有提供与codebase开关相同的输出

好吧,我知道这是非常具体的,但我在整个工作日都失去了它所以我真的需要一些合理的解释,所以我的老板和我的妻子不会解雇我

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

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

方法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

但是当我直接执行codebase switch命令而不是使用reg文件时,在regsitry中受影响的密钥是不同的(并且工作,与前面的输出相反)

 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中的东西和信息更加全面(特别是CodeBase !!!)

如果有人能给我一个理性的理由,那么我可以避免提到超自然活动导致失去工作的一天,我会非常感激

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

regfile标志告诉regasm您要输出实际注册dll的注册表文件INSTEAD。

如果您希望注册表文件输出也包含除注册表之外的dll位置的数据,则可以将它们一起使用,我认为您认为这是一种或两种情况。

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

RegAsm通常会注册有关.dll的基本信息,因为假设它将被加载到GAC中。 GAC中的任何内容都以允许系统控制程序集并将程序集加载到内存中的方式进行注册。 当您使用32位系统并使用codebase标志时,它几乎直接将“codebase”值键添加到定义程序集的注册表项,然后将其值设置为.dll实际所在的路径。

以这种方式注册时,它基本上告诉计算机以及任何想要使用程序集的地方,它可以找到代码,以及如何将其加载到内存中。 有时,这会导致超出GAC所需的额外密钥,以便调用进程知道访问程序集的最佳方式。

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

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