我有一个包含3个项目的Visual Studio 2015 Update 3解决方案:
我的顶级应用程序是MyApp
,其ClassLibrary2
上有项目引用,而ClassLibrary1
上有项目引用:
MyApp -> ClassLibrary2 -> ClassLibrary1
ClassLibrary1
有一个正常执行所需的数据文件data.bin
。预计此数据文件将在Resources/
子文件夹中找到,该子文件夹相对于执行应用程序时ClassLibrary1
程序集的位置。 ClassLibrary1
的结构类似于:
ClassLibrary1.csproj
Resources/
data.bin
MyClassBehaviorDrivenByData.cs
...
data.bin
文件的Build Action
属性设置为Content
(我还尝试使用None
),其Copy to Output Directory
设置为Copy If Newer
}。
如果我执行完整的解决方案Rebuild,data.bin
文件会按预期找到MyApp
的输出目录。但是,如果我在MyApp
项目中进行了一些更改并构建了解决方案,则data.bin
的输出目录中的MyApp
文件已删除(注意:输出窗口显示只构建MyApp
,因为只更改了MyApp
的代码。)
解决方法:
我可以使用MyApp
中的构建后步骤,每次MyApp
构建时强制将数据文件复制到输出目录。但是,这违背了开发人员拥有的原则。 ClassLibrary1
如果添加新数据文件,修改现有数据或将其移动到其他位置,则不必担心在使用项目时修改构建后脚本。
我可以直接从ClassLibrary1
添加对MyApp
的引用。但是,这违反了在ClassLibrary1
API下隐藏ClassLibrary2
功能/ API的愿望(即,我不希望ClassLibrary1
API泄漏到MyApp
)。
我的问题是:在data.bin
的增量构建期间导致MyApp
文件从MyApp
的输出目录中删除的原因是什么?有办法防止这种情况发生没有使用上面列出的2个解决方法之一发生?
答案 0 :(得分:1)
原因是在Incremental Clean任务中删除了该文件,该任务用于确保文件最新(但它只是删除场景的文件)。 要处理此问题,您可以添加新目标以将必要文件复制到目标文件夹。
例如(编辑csproj文件,将此代码添加到结尾(之前):
<ItemGroup>
<resourceFiles Include="..\ClassLibrary1\Resources\*.*"/>
</ItemGroup>
<Target Name="AfterBuild" DependsOnTargets="CopyFiles">
</Target>
<Target Name="CopyFiles" Inputs="@(resourceFiles)"
Outputs="@(resourceFiles->'bin\$(Configuration)\Resources\%(filename)%(extension)')">
<Message Text="after Copy files" Importance="high"/>
<Copy
SourceFiles="@(resourceFiles)"
DestinationFolder="bin\$(Configuration)\Resources"
/>
</Target>
答案 1 :(得分:1)
我有同样的问题。
我的解决方法,虽然我不是很喜欢它,但是在ClassLibrary2项目中包含文件data.bin并设置&#34;复制到输出目录&#34;到&#34;复制如果更新&#34;。我还为ClassLibrary1中的data.bin设置了相同的属性为&#34;不要复制&#34;。