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