Blazor에서 .net 라이브러리에 내장 된 파일을 HTML로 제공

.net-standard blazor c# embedded-resource javascript

문제

나는 비즈니스 로직을 모두 제공하기 위해 .NET Standard 라이브러리를 사용하는 Blazor 프로젝트 v0.5.1을 만들었습니다. 이 라이브러리에는 임베디드 리소스로 저장된 여러 WAV 파일이 있습니다.

이 라이브러리를 참조하는 일반적인 .NET 기술 (WinForms, WPF 등)의 리소스 중 하나를 사용하면 다음 작업을 수행 할 수 있습니다.

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();

나는 Blazor에서 동등한 일을하고 싶습니다. 지금, 나는 프로젝트에서 wwwroot\sounds 폴더에 wav 파일을 복사 / 붙여 넣기하여 앱에서 작동하는 소리를 wwwroot\sounds 정적 HTML 콘텐츠로 제공합니다. 그렇다면 자바 스크립트에서 다음과 같이 재생할 수 있습니다.

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();

하지만 실제로하고 싶은 것은 복사 붙여 넣기를 피하고 그 끝점으로 파일을 동적으로 제공하므로 JS에 투명합니다.

인기 답변

글쎄, 나는 그것을 얻을 수 있었다. 최선의 방법이라면 확실하지 않지만 잘 작동하는 것 같습니다.

Blazor Storage 확장 기능을 추가해야했습니다.

https://github.com/BlazorExtensions/Storage

.NET에서 JavaScript SessionStorage 및 LocalStorage에 대한 프록시 역할을합니다. 로드 된 후에는 .NET에서 다음과 같이 각 포함 된 wav 파일을 추가했습니다.

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
    );
}

ToBase64 는 꽤 표준적인 .NET 스트림 조작입니다.

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
    );
}

이제 모든 데이터는 JavaScript SessionStorage에 문자열로 저장됩니다. 트릭은 이제 그것을 오디오로 디코딩합니다. 이 JS 도우미 메서드 덕분에 (이 StackOverflow 게시물 덕분에) :

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
    );
}

이것을 BlazorComponent의 JsInterop.js 파일에 넣으십시오.

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
    );
}

그리고 마침내 소리는 .Net의 이름으로 호출 할 수 있습니다.

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
    );
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.