如何在.NET Standard 2.0库中包含资产文件?

时间:2017-10-19 13:02:48

标签: c# visual-studio uwp csproj .net-standard

我正在将UWP类库迁移到.NET Standard 2.0库,但是我在库中获得一些资产文件时遇到了一些问题。

我将它们包含在库项目中,名为“Dictionaries”的文件夹下,我将它们设置为包含在输出文件夹中。我的库.csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    <ItemGroup>
        <Content Include="Dictionaries\EN.lst">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
    <ItemGroup>
    ...

我遇到的问题是我从UWP应用程序引用此lib,并且具有这些资源的文件夹不会复制到输出AppX文件夹中,而只会复制到父Debug文件夹中。我的意思是,当我在调试模式下编译时,我会得到这样的结果:

    • 86
      • 调试
        • AppX中
        • 字典
        • ...

现在,AppX文件夹是安装应用程序时分发给设备的唯一文件夹,因此库.dll文件本身包含在该AppX文件夹中。主应用程序的Assets文件夹也是如此。

我知道如何获得执行.dll的路径:

new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath

我希望Dictionaries文件夹与父AppX文件夹中的.dll文件位于同一个文件夹中,但这不是这里的情况,所以在故事的最后我不能消费那些我在库中需要的资产文件。

注意 :因为我知道他们的位置我知道我可以使用正确的路径,但问题是除非这些文件实际上在AppX文件夹中,否则将不会包含在将分发给用户的最终.appx文件中。

我在这里遗漏了一些明显的东西,有没有办法在编译应用程序(AppX文件夹)的实际文件夹中指定要复制的资产文件?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

方法1

您可以在postbuild事件中添加一些命令来处理副本以手动输出。

mkdir $(TargetDir)\AppX\Dictionaries
xcopy /y $(ProjectDir)Dictionaries\EN.lst $(TargetDir)AppX\Dictionaries  

基本上它会在Dictionaries文件夹中创建一个目录AppX,然后将您的EN.lst复制到那里

编辑:我提出了另一种解决方案,您不需要建造后事件。

方法2

由于您正在查看.csproj文件,因此您还可以在<Content>标记中添加一小行:

<Content Include="Dictionaries\EN.lst">
    <Link>AppX\Dictionaries\EN.lst</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>          
</Content>

如果您愿意,也可以重命名.lst数据。

请注意,如果您执行方法2,该文件将从解决方案文件夹中消失。作为解决方法,您可以第二次将其添加到项目中。你可能会像

那样有点蠢蠢欲动
<Content Include="Test\Data.xml">
  <Link>Test\renamed.xml</Link>
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Test\Data.xml">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>

之后在.csproj文件中