【发布时间】:2020-11-17 21:39:40
【问题描述】:
我正在尝试注册在构建期间创建的 DLL。
在项目 properties -> Build Events -> Post-Build-Event 我添加了以下命令来执行注册,
regsvr32 /s /c "$(TargetPath)"
此命令用于注册目标路径中指定的 DLL。 当我尝试构建我的代码时,我面临以下错误,
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5):
error MSB3073: The command "regsvr32 /s /c "D:\Project\Debug\x64\SDK.dll"
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5):
error MSB3073: :VCEnd" exited with code 3.
单击错误时,它会导航到 Microsoft.CppCommon.targets 中的以下标记
<Target Name="PostBuildEvent" Condition="'$(PostBuildEventUseInBuild)'!='false'">
<Message Text="%(PostBuildEvent.Message)" Condition="'%(PostBuildEvent.Message)' != '' and '%(PostBuildEvent.Command)' != ''" Importance="High" />
<Exec Command="%(PostBuildEvent.Command)$(_BuildSuffix)" Condition="'%(PostBuildEvent.Command)' != ''"/>
我在几个链接中搜索了error MSB3073: :VCEnd" exited with code 3,发现当指定的路径无效或找不到时发生。
但是,DLL 的路径位于我指定的位置。我什至尝试在 Post-Build-Event 中提供 DLL 的绝对路径。然而我面临同样的错误。
我在执行 Post-Build-Event 时是否遗漏了什么,或者与 regsvr32 命令有什么关系?
【问题讨论】:
-
这不是问题,但
regsvr32 /c开关自 NT4 时代以来就没有工作过。 -
我认为你的dll项目是动态库项目,项目没有ID。当你想注册一个dll时,你应该确保项目有ID。所以这种类型的项目不能用作将要注册的DLL。
-
您可以尝试将ATL项目用作dll项目,您可以查看我的答案。
-
@PerryQian-MSFT 您好,感谢您的回答。似乎问题是正在使用 w.r.t COM dll 以及未按预期链接到 COM dll 的其他库依赖项。项目太旧,处于优化阶段。在这里,我们需要使用已经实现的 DLL 项目来解决这个问题。正如您提到的,我们还可以找到一些遗留问题。我会尝试实现 DLLRegisterServer 并检查问题是否可以解决。谢谢
-
@SharathKumar,关于这个问题的任何更新?由于您的旧项目是 wrt com 项目,我建议您可以在 VS2017 中创建一个新项目(新项目已在 VS2017 中进行了更新,并且可以很好地与命令配合使用)。然后将您的旧项目迁移到其中。它可以为您节省大量时间并避免一些错误。
标签: visual-studio visual-c++ msbuild post-build-event regsvr32