构建.NET DLL进行COM互操作时出现“拒绝访问注册表键”错误

9

目标: 在另一个环境中构建一个带有COM互操作的C# DLL供Delphi调用

问题: Windows正在阻止我的构建,说我没有权限编辑注册表。

上下文:

  • 我使用的是Windows 8、Visual Studio 2012,并关闭了用户账户控制(UAC)。
  • 我使用RGiesecke的DllExport来注释要导出为DLL的方法,并添加[DllExport]标记。
  • 我按照这里所建议的使用了[ComVisible(true)]
  • 我的解决方案平台目标是x86。
  • 我编辑了解决方案的生成属性并选中了生成 > 输出 > 注册COM互操作
  • 我编辑了AssemblyInfo.cs并启用了[assembly: ComVisible(true)]
  • 我使用强名称为程序集签名
如果我不以管理员身份运行VS2012,我会得到这个错误: 无法注册程序集'absolute\path\to\NameOf.dll',拒绝访问。请确保您以管理员身份运行该应用程序。拒绝访问注册表键'HKEY_CLASSES_ROOT\NameOf.DllClass' 也许我需要以管理员身份运行Visual Studio。但是,如果我以管理员身份运行VS2012,我会得到另一个错误(更随机):无法注册程序集。找不到文件或程序集“RGiesecke.DllExport.Metadata、Version=1.0.0.0、Culture=neutral、PublicKeyToken=ad5f9f4a55b5020b”或它的某一个依赖项。系统找不到指定的文件。 我按照修复:“注册.NET程序集进行COM互操作时出现访问注册表键被拒绝”错误消息的步骤, 找到并更改了HKEY_CLASSES_ROOT\Component Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}的权限。但没有成功。
我该如何获取构建DLL以及生成tlb文件所需的权限?

2
如果我是你,我会将构建与注册分开。它们不应混合在一起。注册需要提升权限,而构建则不需要。以普通用户的方式正常构建项目,然后仅在注册时提升权限。 - David Heffernan
抱歉,可能我混淆了概念,这对我来说仍然很新。但是为了构建,我需要注册,对吧?那么我如何提升自己以注册 Dll,以便稍后可以构建它? - dialex
完全不需要。您可以在没有任何注册的情况下构建软件。注册是让其他程序在运行时找到您的COM对象的方式。一步构建,另一步注册。它们之间没有关联。 - David Heffernan
你最终解决了这个问题吗?我也遇到了完全相同(非常令人沮丧)的问题。 - TwinPrimesAreEz
抱歉,我不记得一年前我是如何解决这个问题的 :( - dialex
3个回答

7

我有同样的问题。我也没有通过你在问题中提供的链接得到解决方法。不过我有一个解决办法。如果你以管理员身份打开Visual Studio,那么一切都可以正常工作(至少对我来说是这样的)。


3

我遇到了同样的问题,通过打开注册表编辑器并前往错误信息提到的键,右键点击并选择“权限...”,我确保我的电脑上的所有用户(因为这是工作电脑)都具有完全权限。保存后,现在它可以正常运行,没有错误。


1
在构建定义的MSBuild Arguments进程参数中传递“/p:RegisterForComInterop=false”,假设您的构建服务器不需要注册COM组件,只需构建它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接