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

时间:2011-11-17 18:34:59

标签: c# .net dll registry

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

根据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 File输出:

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 !!!)

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

1 个答案:

答案 0 :(得分:8)

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

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

如果你想要一个注册表文件输出同时包含除注册表之外的dll位置的数据,这些可以一起使用,我认为你认为它是一个或两种情况。

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

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

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

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

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