将嵌入在.net库中的文件提供给Blazor中的HTML

.net-standard blazor c# embedded-resource javascript

我正在创建一个Blazor项目v0.5.1,该项目使用.NET标准库来提供所有业务逻辑。该库有几个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中做相同的事情。现在,通过将wav文件复制/粘贴到项目的wwwroot\sounds文件夹中,我可以在应用程序中工作,因此它可以作为静态HTML内容提供。然后,在JavaScript中,我可以像这样玩一个:

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中。 Trick现在将其解码为音频。在这个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合法吗? 是的,了解原因