COM互通重建Clean不调用注册unregistration问题。

问题描述 投票:0回答:1

我正在编写一个使用COM Interop的库插件,在清理和重建任务中遇到了问题。Visual Studio 2019的设置是运行外部程序进行调试,并在构建后运行.dll注册,使用的是 regasm 来为外部程序写入注册表值。我正在使用 "Register for COM interop "选项。

这在cleanrebuild任务中引起了问题。如果我在解决方案上运行cleanrebuild,我就会收到以下信息 Access to the <dllPath> path is denied 但如果我对每个单独的库进行清理,或者运行两次清理(第一次出现错误,第二次正常),事情似乎可以进行,但在关闭VS后,msbuild和VBCSCompiler服务被挂起。

然而,如果我通过命令行取消注册库,使用 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在cleaningrebuilding时没有调用这个),它会在外部程序注册表项中留下工件,但它会清除GC项。

有没有办法让所有这些都同步起来,或者我需要恢复到一个完全手动的构建过程来处理注册的问题?是否有一个选项可以告诉VS在buildclean过程中调用registerunregister函数?我是否缺少一个步骤或配置设置?

c# .net .net-4.0 com-interop
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.