我有一个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#项目,其中有两个文件。
但是如果我运行这个,那么它就会在目标 "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也不会有警告符号。
你可以重命名DLL文件所在的路径吗?如果不把这些文件夹命名为File_32bit和File_64bit,而是命名为File_x86和File_x64.那么你就可以有ItemGroup。
<ItemGroup>
<Source32Bit Include="File_$(Platform)\File.dll" />
<Source64Bit Include="File_$(Platform)\File.dll" />
</ItemGroup>
注:我不知道这样做是否可行。