c# - 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 在构建/清理期间调用注册/注销函数?我是否缺少步骤或配置设置?
解决方案
正如西蒙指出的那样,我不需要启用“注册 COM 互操作”选项,因为我RegAsm.exe
在构建中调用,禁用此选项可以让文件更新没有任何问题。
推荐阅读
- python - 使用 pyodbc 连接到 MS Access
- react-native - 类型和有效负载正在被调度而不调用它
- autodesk-designautomation - x 字节的有效负载长度超过了 8192 字节的允许限制
- laravel - 如何在 Laravel 中防止 DynamoDb 异常 ProvisionedThroughputExceededException
- ajax - 下载后从存储中删除文件
- mongodb - 你如何检查一个集合是否有上限?
- javascript - 仅在选项卡焦点上勾勒
- python - 如何计算不同张量的协方差?
- mongodb - 具有位置、范围和排序的最佳索引字段顺序
- java - 如何获取 Firebase 中的最后一个节点?