在Visual Studio中的MSBuild - 在将文件作为内容之前移动文件(C#)

问题描述 投票:0回答:1

我有一个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 "还没有运行之前,它就试图执行Content Include,所以找不到该目录中的File.dll。如果我为这个内容包含做一个目标,并尝试执行AfterTarget="CopyFiles",它就会抱怨CopyToOutputDirectory。

我应该如何处理这个问题?有什么想法吗?谢谢!我有一个C#项目,其中有两个文件。

c# c++ visual-studio msbuild
1个回答
0
投票

但是如果我运行这个,那么它就会在目标 "CopyFiles "还没有运行之前,就试图执行Content Include,所以它找不到该目录下的File.dll。如果我为这个内容包含做一个目标,并尝试执行AfterTarget="CopyFiles",它就会抱怨CopyToOutputDirectory。

主要原因是 构建 目标执行 后来 而不是MSBuild来读取 项目要素因此,当你执行复制操作时,已经晚于读取Item元素的时间,所以项目无法找到复制的文件。因此,您只需要执行 复制文件 目标,然后再读取Item元素。

所以 我发现一个系统目标叫 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 有一个黄色的三角形,这是一个正常的行为,因为你没有构建你的项目。而且它需要先进行构建过程。

你应该先构建你的项目 而不会出现任何错误,并且在Solution Explorer中的test.dll也不会有警告符号。


0
投票

你可以重命名DLL文件所在的路径吗?如果不把这些文件夹命名为File_32bit和File_64bit,而是命名为File_x86和File_x64.那么你就可以有ItemGroup。

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

注:我不知道这样做是否可行。

© www.soinside.com 2019 - 2024. All rights reserved.