首页 > 解决方案 > COM Interop Rebuild/Clean 不调用注册/注销问题

问题描述

我正在编写一个使用 COM Interop 的库加载项,并且在清理和重建任务期间遇到问题。Visual Studio 2019 设置为运行外部程序进行调试,并在构建后运行 .dll 注册,regasm用于为外部程序写入注册表值。我正在使用“注册 COM 互操作”选项。

这会在清理/重建任务期间引起问题。如果我对收到的解决方案运行清理/重建,Access to the <dllPath> path is denied但如果我对每个单独的库运行清理或运行清理两次(第一次出错,第二次有效),事情似乎可以工作,但会使 msbuild 和 VBCSCompiler 服务挂起关闭VS后。

但是,如果我在构建项目之前通过命令行使用取消注册库C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm /unregister <dllPath>,VS 会抛出一个错误,指出注册表项不存在,VS 认为它需要取消注册库,但清理按预期工作并删除bin/Debug.

要运行注册,我有:

<PropertyGroup>
  <FrameworkSDKPath>
     $(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework@InstallRoot)
  </FrameworkSDKPath>
</PropertyGroup>
<PostBuildEvent>
   "$(FrameworkSDKPath)v4.0.30319\regasm" /codebase "$(TargetPath)"
</PostBuildEvent>

如果我没有构建后事件,它只会在 GC 中注册 .dll,但不会调用用修饰的方法,[ComRegisterFunction]并且外部程序无法识别它。除了不删除文件之外,还有几个问题,如果[ComUnregisterFunction]没有调用修饰符(VS 在清理/重建时不会调用它),它将在外部程序注册表条目中留下工件,但它会清除 GC 条目。

有没有办法让所有这些同步,还是我需要恢复到完全手动构建过程来处理注册?是否可以选择告诉 VS 在构建/清理期间调用注册/注销函数?我是否缺少步骤或配置设置?

标签: c#.net.net-4.0com-interop

解决方案


正如西蒙指出的那样,我不需要启用“注册 COM 互操作”选项,因为我RegAsm.exe在构建中调用,禁用此选项可以让文件更新没有任何问题。


推荐阅读