我可以使用属性"将文件放入bin目录;如果是更新"则复制。
我遇到的问题是我需要将大量的dll文件放在我的应用程序旁边。这意味着我的项目中充斥着大量文件。
我想将我的文件放入我的解决方案中的资源文件夹中,但是在构建时将bin文件中的文件存在。我尝试过使用post build事件但是我一直在获取Windows错误代码(即使它成功了)。
是否有其他方法可以让我的应用程序访问外部dll?
答案 0 :(得分:1)
如果您unload the project file,则可以编辑.csproj文件。
接近结束时,你会发现:
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
-->
让我们修改一下。
首先定义AfterBuild任务要复制的Items。请注意,您只需要确保磁盘上存在这些文件在文件夹中(您说它称为资产)并且受源代码管理。您不需要在解决方案或项目中包含任何这些文件。
<ItemGroup>
<!-- Include relative to this project file, so ..\assets would bring you to the solution folder
Take all files in the assets folder and subfolders, except *.txt files
-->
<Asset Include="assets\**" Exclude="*.txt">
</Asset>
<!-- take all *.txt files -->
<TextAsset Include="assets\**\*.txt">
<!-- meta data -->
<SubPath>TextFiles</SubPath>
</TextAsset>
</ItemGroup>
现在您将拥有两个Item集合,一个名为Asset,另一个名为TextAsset。这些项目可以在构建Tasks中使用。我们将使用Copy任务。我已经评论了构建脚本来解释会发生什么。
<!-- this does what the name suggests-->
<Target Name="AfterBuild">
<!-- log -->
<Message Importance="high" Text="Start Copying assets"/>
<!-- copy Asset files to one folder (flattens) -->
<Copy SourceFiles="@(Asset)"
DestinationFolder="$(OutputPath)" />
<!-- copy TextAsset files to a subpath, keep folder structure-->
<Copy SourceFiles="@(TextAsset)"
DestinationFiles="@(TextAsset->'$(OutputPath)%(SubPath)\%(RecursiveDir)%(Filename)%(Extension)')" />
<!-- done logging -->
<Message Importance="high" Text="Copied assets"/>
</Target>
请注意,我使用的属性$(OutputPath)
是well known properties之一。 item meta data存在类似的列表。
这些更改不会影响visual studio的操作。添加或删除常规项目项目和/或项目设置时,将保留您的更改。由于您将此文件保留在源代码管理中,同样在您的构建服务器上,将运行相同的目标,执行相同的副本。
我更喜欢从命令行测试这些构建目标,只指定我感兴趣的目标,如下所示:
msbuild Application2.csproj /t:AfterBuild
这为您提供了更快的往返时间,而不是完整的构建。