【问题标题】:regasm /codebase works but file generated with regasm /codebase /regfile does notregasm /codebase 有效,但使用 regasm /codebase /regfile 生成的文件无效
【发布时间】:2013-11-18 03:55:16
【问题描述】:

我有一个适用于 32 位和 64 位架构的 COM 可见 dll,我用它来将菜单项添加到 Windows 资源管理器上下文菜单中。使用“regasm myassembly.dll /codebase”注册 dll 并查看新菜单项。伟大的。注销也可以。

现在我想创建一个 .reg 文件,以便可以将菜单项添加到非开发机器。我使用“regasm myassembly.dll /codebase /regfile”生成一个我可以使用 regedit 导入的 reg 文件。问题是,在导入 .reg 后,我看不到菜单图标。为什么注册会失败?请注意,我使用的是 64 位系统。

【问题讨论】:

  • 可能是 64/32 位的东西,另见 stackoverflow.com/questions/8172392/…
  • 我认为很可能是这种情况。在使用 regasm 注册后,我将不得不查看注册表,然后在使用 .reg 后查看有什么区别。

标签: c# com regasm regedit


【解决方案1】:

注册 shell 扩展需要编写比注册[ComVisible] .NET 程序集通常所需的更多的注册表项。
您还必须 write the keys Explorer 读取以发现扩展。
您根本没有提到您是如何处理的,这通常需要自定义[ComRegisterFunction]。但可以肯定的是,.reg 文件不会包含这些密钥,因为自定义注册功能需要运行代码。

【讨论】:

  • 感谢您在此输入。我正在使用SharpShell 来处理讨厌的工作,所以在这种情况下我只需要注册 com 可见程序集。
  • 是的,它有一个 [ComRegisterFunction]。显然,您不会得到它在 .reg 文件中写入的密钥。
【解决方案2】:

您应该知道这是一个非常非常糟糕的主意。请阅读这篇关于该主题的经典帖子。

http://blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx

那么最近的更新:

http://blogs.msdn.com/b/oldnewthing/archive/2013/02/22/10396079.aspx

即使您坚持要尝试此操作(或者如果程序集用于插件以外的其他东西),尝试使用 .reg 文件注册程序集仍然是个坏主意。

除了 COM 注册之外,还需要执行更多操作才能使程序集正常工作。很可能您必须将其添加到 GAC 以便 .NET 可以找到它。此外,.NET 的未来版本可能需要在注册表中添加更多信息或不同的信息。即使在今天(我怀疑),REGASM 也可能需要在不同的环境(x86 与 x64)上放置不同的信息。

【讨论】:

  • 感谢您的信息。还有一些关于这个here 的其他文章,并非所有文章都驳斥了这个想法。 reg 文件由 regasm 本身生成,应该简单地复制工具对注册表所做的更改。也不需要将 dll 添加到 GAC,因为“/codebase”标志将 dll 的位置存储在注册表中。话虽如此,我会看看替代方案,因为事实证明这很麻烦。
  • @Matt,感谢您指出该链接。这是对明显相互矛盾的观点的有趣总结。显然,这个人已经做了很多研究。就个人而言,我不得不听从 MS 的官方指导——这是官方的原因——以及 Raymond Chen 的立场,我非常尊重他的意见。也许我可以从我的帖子中撤回一个“真的”作为妥协:-)
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多