Answers:
而不是<Content>
使用<ContentWithTargetPath>
并指定目标路径,如下所示:
<ItemGroup>
<ContentWithTargetPath Include="lib\some_file.dat">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>some_file.dat</TargetPath>
</ContentWithTargetPath>
<ItemGroup>
请注意,此条目在Visual Studio(2012、2015、2017)中可能不可见,但是一旦手动添加到csproj中,它将显示在Visual Studio中。但是,目标路径将无法通过UI进行编辑。
ContentWithTargetPath
符渐进式编译(在2017年VS测试15.9.9)
保留它们$(ProjectDir)\Lib
,但是将这些文件“ 作为链接 ”添加到.csproj的根目录中。现在,它们将被复制到bin \ Debug(或任何其他输出文件夹),而无需放在lib中。
编辑:这个答案是在我使用的VS / MSBuild版本中没有ContentWithTargetPath时写的。对于可能不得不使用旧版VS的人,请在此处保留此答案。请停止对此发表评论,我们都知道现在有更好的方法。
如果您的主要目的是在不使项目根目录混乱的情况下包含DLL,则另一种解决方案是将DLL移动到单独的共享项目中并将其作为引用添加到原始项目中。
(请注意,本文并未直接回答此问题,因为它未保留文件夹和项目结构,但是我发现这种方法很有用,因为我能够根据自己的情况来重组项目,并且因为我想避免某些这里其他方法的缺点。)
脚步
Solution -> Add -> New Project -> Shared Project
Build Action: Content
和Copy to Output Directory: Copy Always
)References -> Add Reference -> Shared Projects
设置如下所示:
将dll文件添加为对项目的引用,并在引用上将“复制本地”设置为true。
如果需要将文件从Libs目录复制到VS2017根文件夹中,请执行以下操作:
<ItemGroup Condition="'$(Platform)' == 'x64'">
<None Include="Libs\x64\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
<None Include="Libs\x86\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
到任何其他文件夹,包括Libs(RecursiveDir)文件夹
<ItemGroup Condition="'$(Platform)' == 'x86'">
<None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
似乎在Visual Studio 2015中,如果您要“添加链接”的dll 位于该项目的子文件夹中它们将自动放置在一个文件夹中,并且输出也将像您看到的那样放置在一个文件夹中。
如果dll位于项目的另一个目录或磁盘上的目录中,而不位于该项目的子文件夹中,则可以“添加链接”,它们将被放在根目录中。
另一种方法是将项目保留为type None
。在解决方案资源管理器中,单击要部署的Content
属性,然后将属性设置为True
。
注意:我是在VS2019中执行此操作的,各个版本之间可能会发生变化。
为了使它起作用,现在右键单击您的项目,然后选择“卸载项目”。然后右键单击已卸载的项目,然后选择“编辑project_name.vcxproj”。
在编辑器中,一直移至文件底部,然后在尾随</Project>
标记之前插入此目标:
<Target Name="CopyContent" AfterTargets="Build">
<Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
</Target>
现在,右键单击已卸载的项目,然后选择“重新加载项目”。如果出现提示,请选择保存并关闭。
我还将设置OutputDirectory
为:
$(SolutionDir)bin\$(Configuration)\$(Platform)\
和IntermediateDirectory
到:
$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\
在“项目属性”的“常规”页面中。这会将输出放在解决方案根目录下的“ bin”文件夹中,并将中间体放在“ obj”文件夹中。
注意:$(SolutionDir)
当您从命令行运行MSBuild时,未定义。您可以使用一个技巧来使用GetDirectoryNameOfFileAbove将其定义为.sln文件所在的文件夹。(留给读者练习)。此外,看起来他们在2019年仍然在命令行上正确处理了此问题。是啊:)将$(SolutionDir)
包含斜杠,后因此没有。每个结果必须有一个反斜杠。
现在,如果您拥有Pro或更高版本,请不要在每次需要创建项目时都这样做。那真是la脚。相反,一旦按照您喜欢的方式设置了项目,请选择Project -> Export Template
。给它起一个名字,下一次要创建一个与该名字相同的项目时,只需在“新建项目”对话框中选择该名字即可。(在旧版本中,我认为是Files -> Export Teamplate...
。)