MSBuild 无法从相对路径复制 dll

MSBuild fails to copy dlls from relative path

解决方案目录包含 ExtraDll 和项​​目目录。 在 Project.csproj 文件中,我们在具有相对路径的 ExtraDll 中引用了 dll。 ExtraDlls 目录下的 Dll 总是可用的。

<Reference Include="xyx, Version=7.3.0.0, Culture=neutral, PublicKeyToken=<sometoken>">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\ExtraDlls\A.dll</HintPath>
    </Reference>
<Reference Include="xyz, Version=7.4.0.0, Culture=neutral, PublicKeyToken=<sometoken>">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\ExtraDlls\B.dll</HintPath>
      <Private>True</Private>
    </Reference>

使用下面的批处理文件来发布网络项目。但它失败了,下面提到了细节。

SET MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio19\Professional\MSBuild\Current\Bin"
SET PUBLISH_DIRECTORY="C:\publish\ProjectA"
SET PROJECT_DIR="C:\SolutionDir\ProjectDir"
SET PROJECT="C:\SolutionDir\ProjectDir\Project.csproj"
cd %PROJECT_DIR%

%MSBUILD_PATH%\MSBuild.exe %PROJECT%  /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%

PreBuildEvent:

        copy "..\ExtraDlls\A.dll" "C:\SolutionDir\ProjectDir\bin\"
        copy "..\ExtraDlls\B.dll" "C:\SolutionDir\ProjectDir\bin\"

  The system cannot find the path specified.
  The system cannot find the path specified.

C:\Program Files (x86)\Microsoft Visual Studio19\Professional\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(1328,5): error MSB3073:       copy "..\ExtraDlls\A.dll" "C:\SolutionDir\ProjectDir\bin\" [C:\SolutionDir\ProjectDir\Project.csproj]

C:\Program Files (x86)\Microsoft Visual Studio19\Professional\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(1328,5): error MSB3073:       copy "..\ExtraDlls\B.dll" "C:\SolutionDir\ProjectDir\bin\" [C:\SolutionDir\ProjectDir\Project.csproj]

C:\Program Files (x86)\Microsoft Visual Studio19\Professional\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(1328,5): error MSB3073:     " exited with code 1.

已尝试在批处理文件中更改根目录。即当根目录设置为包含 MSBuild.exe 时,仍然会遇到同样的问题。

使用 $(SolutionDir) 更新设置引用没有帮助。 例如$(SolutionDir)..\ExtraDlls\B.dll

还有更多来自 ExtraDlls 的参考,但仅以上两个显示错误。尝试将 project.csproj 文件中的相对路径更改为绝对路径,但仍然出现相同的错误。所以看起来它是从其他地方引用的。

在 project.csproj 文件的 PreBuildEvent 部分添加代码,如果 SolutionDir 不可用则使用 ..\(我猜 visual studio 可以理解)但是 MSBuild 抛出错误或实际上检查以 .\ 开头的不存在的路径。

在使用 MSBuild.exe 命令时传递一个 属性 /属性:SolutionDir="Path to solution file directory" 来解析所有引用并正确复制所有 ExtraDll。

例如

MSBuild /Property:SolutionDir=%SOL_DIR_PATH% %PROJECT_SLN_PATH%\%PROJECT_DIRECTORY_NAME%\%PROJECT_NAME%  /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%\%PROJECT_DIRECTORY_NAME%