Dateien in .net Bibliothek in HTML in Blazor enthalten

.net-standard blazor c# embedded-resource javascript

Frage

Ich erstelle ein Blazor- Projekt v0.5.1, das eine .NET-Standardbibliothek verwendet, um die gesamte Geschäftslogik bereitzustellen. Diese Bibliothek enthält mehrere WAV-Dateien, die als eingebettete Ressourcen gespeichert sind.

Das Verwenden einer der Ressourcen in einer typischen .NET-Technologie (WinForms, WPF usw.), die auf diese Bibliothek verweisen, kann folgendermaßen durchgeführt werden:

var assemName = "MyLibName";
var assembly = AppDomain
    .CurrentDomain
    .GetAssemblies()
    .First(a => a.GetName().Name == assemName);

//memory stream
var stream = assembly.GetManifestResourceStream($"{assemName}.mysound.wav");

//Can play the file at some point later
var player = new SoundPlayer(stream)
player.Play();

Ich würde gerne das Äquivalent in Blazor machen. Im Moment habe ich Sounds in der App arbeiten durch Kopieren / Einfügen der WAV-Dateien in wwwroot\sounds Ordner des Projekts, so dass es als statischer HTML-Inhalt serviert wird. Dann kann ich in JavaScript eines davon spielen:

var assemName = "MyLibName";
var assembly = AppDomain
    .CurrentDomain
    .GetAssemblies()
    .First(a => a.GetName().Name == assemName);

//memory stream
var stream = assembly.GetManifestResourceStream($"{assemName}.mysound.wav");

//Can play the file at some point later
var player = new SoundPlayer(stream)
player.Play();

Aber was ich wirklich gerne tun würde, ist das Kopieren-Einfügen zu vermeiden und irgendwie die Dateien dynamisch als diese Endpunkte zu dienen, so dass es für JS transparent ist.

Beliebte Antwort

Nun, ich konnte es bekommen. Nicht sicher, ob es der beste Weg ist, aber es scheint gut zu funktionieren.

Ich musste die Erweiterung blazor Storage hinzufügen:

https://github.com/BlazorExtensions/Storage

Dies dient als Proxy für das JavaScript SessionStorage und LocalStorage von .NET. Nach dem Laden habe ich jede eingebettete WAV-Datei wie folgt aus .NET hinzugefügt:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Die ToBase64 ist ziemlich Standard-.NET-Stream-Manipulation:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Jetzt werden alle Daten in JavaScript SessionStorage als Strings gespeichert. Trick ist jetzt, das zu Audio zu entschlüsseln. Mit Hilfe dieser JS-Hilfsmethode (dank dieses StackOverflow-Posts ):

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Setze das und das in die JsInterop.js-Datei der BlazorComponent:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Und ENDLICH können die Sounds mit dem Namen von .Net aufgerufen werden:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum