MSBuild в Visual Studio - перемещение файлов перед включением их в качестве содержимого (C#) - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть проект 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" и не сможет найти файл. .dll в этом каталоге. Если я включаю цель для этого содержимого и пытаюсь выполнить AfterTarget = "CopyFiles", он жалуется на CopyToOutputDirectory.

Как мне справиться с этим? Любые идеи? Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Но если я запускаю это, то он пытается выполнить включение содержимого перед запуском целевого объекта «CopyFiles», и поэтому не может найти File.dll в этом каталоге. Если я задаю цель для этого содержимого, включаю и пытаюсь выполнить AfterTarget = "CopyFiles", он жалуется на CopyToOutputDirectory.

Основная причина заключается в том, что Build target выполняет позже , чем MSBuild, чтобы прочитать элементы Item , поэтому при выполнении операции копирования уже происходит чтение элементов Item, поэтому проект не может найти скопированный файл. Поэтому вам нужно только выполнить цель CopyFiles перед чтением элементов 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 имеет желтый треугольник, который является нормальным поведением, потому что вы не строили свой проект. И это требует процесса сборки в первую очередь.

Сначала вы должны построить свой проект , и это не приведет к ошибкам, и когда test.dll в обозревателе решений не будет иметь предупреждающий символ.

0 голосов
/ 29 апреля 2020

Можете ли вы переименовать путь, по которому находятся файлы DLL? Если вместо именования этих папок File_32bit и File_64bit, вы можете назвать их File_x86 и File_x64. Тогда вы могли бы иметь ItemGroup:

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

Примечание: я действительно не знаю, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...