web-dev-qa-db-ja.com

.Net Coreライブラリの埋め込みリソース

.Net Coreの調査を始めたばかりですが、古典的なリソースやリソースのように見えるものは見当たりません。古典的な.Netクラスライブラリでは、たとえば、スクリプトを含むテキストフィルトをプロジェクトに追加できました。これらのファイルをプロジェクトのリソースに追加することはできませんでした。その後、次の方法で簡単に使用できます。

Connection.Execure(Properties.Resources.MySuperScript);

.Net Coreライブラリにはこのような機能はないようです。少なくとも私にはわかりません。いくつかの静的データをライブラリの埋め込みリソースとして保存するための代替手段が.Net Coreにありますか?そして、それが存在する場合、それをどのように使用しますか?

48
Don Tomato

UPDATE:

.NET Core 1.1以降では、project.jsonが削除され、.csprojファイルに戻りました。これはステップ2を変更しますが、それほど多くはありません。必要な行は非常に似ています:

<ItemGroup>
  <Content Remove="_fonts/OpenSans.ttf" />
  <Content Remove="_fonts/OpenSans-Bold.ttf" />
  <Content Remove="_fonts/OpenSans-Italic.ttf" />
</ItemGroup>
<ItemGroup>
  <EmbeddedResource Include="_fonts/OpenSans.ttf" />
  <EmbeddedResource Include="_fonts/OpenSans-Bold.ttf" />
  <EmbeddedResource Include="_fonts/OpenSans-Italic.ttf" />
</ItemGroup>

同様の*.tffフォームがある場合があります。未確認。

手順1と3は変更されていません。


.NET Core 1.0プロジェクトで埋め込みリソースを使用するには、次の手順を実行します。

1.-通常どおり、埋め込みファイルを追加します。

例:「_fonts」という名前のディレクトリにあるいくつかのFONTファイル

enter image description here

2.-「project.json」を変更して、関連リソースを含めます。

私の場合:

 "buildOptions": {
    "embed": {
      "include": [
        "_fonts/*.ttf"    
      ]
    } 
  },

3.-コード内の埋め込みリソースにアクセスします。

var Assembly = typeof(MyLibrary.MyClass).GetTypeInfo().Assembly;
Stream resource = Assembly.GetManifestResourceStream("MyLibrary._fonts.OpenSans.ttf");

重要な点は、「GetManifestResourceStream」呼び出しで正しい名前を使用することです。 [アセンブリ名]。[ディレクトリ]。[ファイル名]を使用する必要があります。

それが誰かを助けることを願っています^ _ ^。

72
Nacho Coll

project.jsonが廃止されたので、.csprojファイルでこれを指定する必要があります。

<ItemGroup>
    <EmbeddedResource Include="_fonts\*.ttf" />
</ItemGroup>

図のようにワイルドカードを使用するか、ファイルを明示的にリストするだけです。

47
Drew Noakes

人々はすでに一般的にこれに答えているので、これは答えを単純なものにレンダリングしたものです。

以下を使用する前に、ファイルを埋め込みリソースとして。csproj/project.json

使用法

var myJsonFile = ReadManifestData<Tests>("myJsonFile.json");
  1. パラメーター:埋め込みファイル名。タイプ:ターゲットリソースのアセンブリのクラス
  2. その名前の埋め込みリソースを探します
  3. 文字列値を返します

メソッド

public static string ReadManifestData<TSource>(string embeddedFileName) where TSource : class
{
    var Assembly = typeof(TSource).GetTypeInfo().Assembly;
    var resourceName = Assembly.GetManifestResourceNames().First(s => s.EndsWith(embeddedFileName,StringComparison.CurrentCultureIgnoreCase));

    using (var stream = Assembly.GetManifestResourceStream(resourceName))
    {
        if (stream == null)
        {
            throw new InvalidOperationException("Could not load manifest resource stream.");
        }
        using (var reader = new StreamReader(stream))
        {
            return reader.ReadToEnd();
        }
    }
}
4
Dann

ファイルを使用してプロジェクトにサブフォルダーを作成するだけです。

プロパティで、ファイルを「埋め込みリソース」および「新しい場合にコピー」にします。 enter image description here

それらが公開され、フォルダーとファイルが作成され、次のようにアクセスできます。

var mySuperScript= File.ReadAllText(System.IO.Directory.GetCurrentDirectory() + @"\folder\MySuperScript.js")
0
A. Morel

.Net Coreの新しいバージョン-2.0以降では、埋め込みファイルの読み取りを抽象化する特殊なクラスEmbeddedFileProviderがあります。使用するには、アプリケーションにMicrosoft.Extensions.FileProviders.Embeddedパッケージを追加します。

dotnet add package Microsoft.Extensions.FileProviders.Embedded

EmbeddedFileProviderを使用すると、ストリームリーダーを作成し、シナリオに従って使用できます。

var embeddedProvider = new EmbeddedFileProvider(Assembly.GetExecutingAssembly());
using (var reader = embeddedProvider.GetFileInfo("yourfile.ext").CreateReadStream())
{
  // some logic with stream reader
}