【问题标题】:MSB3073 exited with code 3 - Post Build Event in Visual Studio 2017MSB3073 以代码 3 退出 - Visual Studio 2017 中的构建后事件
【发布时间】: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


【解决方案1】:

MSB3073 以代码 3 退出 - Visual Studio 2017 中的构建后事件

问题与您的动态库项目有关,与 VS 无关。

当你想注册一个com dll时,这个dll项目应该包含一个ID来注册到系统中。 但是,动态库项目默认没有ID。所以这种类型的项目不能用作要注册的DLL。

如果你还想使用动态库项目,你应该implement DllRegisterServer添加ID

您可以将包含 IDATL 项目 用作 dll 项目。

这是a similar issue about it

解决方案

1) 相反,您应该创建ATL projects

2) 那么,在命令中,你应该删除目前被废弃的/c

或者像这样使用命令:

regsvr32 /n /i "$(TargetPath)" 作为构建后事件中的命令。

======================

更新 1

由于你的项目是旧的WRT项目,你可以在VS2017中新建一个WRT运行时组件项目,然后将旧项目的内容迁移到新的一。它将为您节省大量时间并避免很多繁琐的错误。

1)请先安装C++/WinRT vs 扩展。

2) 然后创建一个新的windows runtime componment 项目,然后将旧项目的内容迁移到新项目中。

在我这边,该项目可以通过命令regsvr32 /n /i "$(TargetPath)"很好地运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2016-09-10
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多