.net core 复制文件以用作嵌入式资源

.net core 复制文件以用作嵌入式资源,.net-core,msbuild,csproj,.net Core,Msbuild,Csproj,我有一个.NET核心项目,在构建之前,我想从项目文件夹外部复制文件,以便它们可以用作嵌入式资源 我的csproj文件如下所示: 但是,似乎存在竞争条件-文件按预期复制到目标文件夹,但在第一次生成时未作为嵌入资源包含。它们被包含在后续构建中-构建目标似乎是异步执行的,并且在构建开始之前没有完成 我尝试将BeforeTargets更改为Compile,而不是PreBuildEvent,但得到了相同的行为 我还尝试使用Exec任务,但得到了相同的结果: 是否有某种方法确保在指定目标之前实际执行

我有一个.NET核心项目,在构建之前,我想从项目文件夹外部复制文件,以便它们可以用作嵌入式资源

我的csproj文件如下所示:


但是,似乎存在竞争条件-文件按预期复制到目标文件夹,但在第一次生成时未作为嵌入资源包含。它们被包含在后续构建中-构建目标似乎是异步执行的,并且在构建开始之前没有完成

我尝试将
BeforeTargets
更改为
Compile
,而不是
PreBuildEvent
,但得到了相同的行为

我还尝试使用
Exec
任务,但得到了相同的结果:


是否有某种方法确保在指定目标之前实际执行构建目标

更新 因此,我想在
Exec
任务中添加一个sleep,我可以看到它至少在进入构建阶段之前看起来是等待的:



但是,在第一次复制时,复制的文件仍然不会作为嵌入资源添加。我想知道这是否是嵌入式资源的一个特定问题?

我找到了一个解决方法,感谢您的回答:


... 
...

EmbeddedResource
任务与
Copy
任务放在同一个自定义目标中,似乎可以确保在复制文件之前不会尝试嵌入资源。

可能最好使用
LinkBase
从项目文件夹外部包含资源。无需目标和复制步骤:

<ItemGroup>
  <EmbeddedResource Include="..\..\config\*.sql" LinkBase="Resources\Sql\" />
</ItemGroup>


如果您不想在解决方案资源管理器中看到它们,可以将
Visible=“False”
添加到
EmbeddedResource
xml标记。

如果这样做,嵌入资源的名称是否仍如预期的那样,例如
MyAssembly.resources.Sql.myfile.Sql
?是,逻辑名称默认为链接元数据(根据
LinkBase
+(递归dir if
***/
通配符)+文件名+扩展名(在.NET Sdk项目中)。如果需要磁盘上的不同位置、解决方案资源管理器中的不同位置以及生成的程序集中的不同名称/路径,也可以通过
LogicalName
元数据进行自定义)非常好,这确实像预期的那样有效,谢谢!如果确实要使用
Copy
,请确保从Copy的
CopiedFiles
输出参数创建
FileWrites
项,以便在增量生成过程中清理文件,并且不会在项目目录中出现从“config”文件夹中删除的文件。