【问题标题】:MSBuild in Visual Studio - Moving files before including them as content (C#)Visual Studio 中的 MSBuild - 在将文件包含为内容之前移动文件 (C#)
【发布时间】:2020-08-13 17:01:07
【问题描述】:

我有一个 C# 项目,它有两个同名的 C++ .dll 版本,但根据它们的体系结构(32 位或 64 位)不同,它们存储在不同的文件夹中,并且必须具有相同的名称,我想要包含具有该名称的正确文件。

所以计划是在构建时首先检查当前平台,将正确的文件从正确的文件夹(基于平台)复制到项目目录中,然后将该文件作为内容包含到项目中以便可以使用。

<ItemGroup>
    <Source32Bit Include="File_32bit\File.dll" />
    <Source64Bit Include="File_64bit\File.dll" />
</ItemGroup>

<Target Name="CopyFiles" BeforeTargets="Build" >
    <Copy SourceFiles="@(Source32Bit)" DestinationFolder="$(ProjectDir)" Condition=" '$(Platform)' == 'x86' " />
    <Copy SourceFiles="@(Source64Bit)" DestinationFolder="$(ProjectDir)" Condition=" '$(Platform)' == 'x64'" />     
</Target>

<ItemGroup>
    <Content Include="File.dll">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

但如果我运行它,它会在目标“CopyFiles”运行之前尝试执行内容包含,因此它无法在该目录中找到 File.dll。如果我为此内容包含目标并尝试执行 AfterTarget="CopyFiles" 它会抱怨 CopyToOutputDirectory。

我应该如何处理?有任何想法吗?谢谢!

【问题讨论】:

  • 不要在VS中编译,而是使用具有更多选项的命令行编译器进行编译。
  • 请检查我的回答是否能帮助您解决问题。

标签: c# c++ visual-studio msbuild


【解决方案1】:

但如果我运行它,它会尝试在 目标“CopyFiles”已运行,因此无法在其中找到 File.dll 目录。如果我为此内容设定目标并尝试做 AfterTarget="CopyFiles" 它抱怨 CopyToOutputDirectory。

主要原因是Build目标比MSBuild执行来读取Item元素,所以当你执行复制操作时,它已经晚于读取 Item 元素,因此项目找不到复制的文件。因此,您只需要在读取 Item 元素之前执行 CopyFiles 目标即可。

所以我找到了一个名为 FindInvalidProjectReferences 的系统目标,它在读取 Item 元素之前执行。

解决方案

试试这些:

<ItemGroup>
    <Source32Bit Include="File_32bit\File.dll" />
    <Source64Bit Include="File_64bit\File.dll" />
  </ItemGroup>
  <Target Name="CopyFiles" BeforeTargets="FindInvalidProjectReferences">
    <Copy SourceFiles="@(Source32Bit)" DestinationFolder="$(ProjectDir)" Condition=" '$(Platform)' == 'x86' " />
    <Copy SourceFiles="@(Source64Bit)" DestinationFolder="$(ProjectDir)" Condition=" '$(Platform)' == 'x64'" />

  </Target>

    <ItemGroup>
        <Content Include="File.dll">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
    </ItemGroup>

注意:当您第一次加载项目时,test.dll 有一个黄色三角形,这是正常现象,因为您没有构建项目。它首先需要构建过程。

您应该先构建您的项目,它不会出现任何错误,并且解决方案资源管理器中的 test.dll 将没有警告符号。

【讨论】:

  • 谢谢!这可行,但实际上我也解决了这个问题,只需在 .csproj 文件顶部的项目中添加一个 InitialTargets 标记,然后它将在其余部分之前运行我的目标!
【解决方案2】:

能否重命名 DLL 文件所在的路径? 如果不将这些文件夹命名为 File_32bit 和 File_64bit,您可以将它们命名为 File_x86 和 File_x64。 然后你可以有 ItemGroup:

<ItemGroup>
  <Source32Bit Include="File_$(Platform)\File.dll" />
  <Source64Bit Include="File_$(Platform)\File.dll" />
</ItemGroup>

注意:我真的不知道这是否有效。

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 2013-09-19
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多