【发布时间】:2021-03-27 01:44:39
【问题描述】:
我已经开始使用 Blazor 并设置一个托管的 Web 程序集应用程序。
在 App.Razor 中,我使用从 API 加载的延迟加载程序集,然后使用反射检查每个 dll 以查找特定接口的实现。
当通过 Visual Studio(调试)运行解决方案时,这非常有效。当我发布解决方案时,在加载说明 System.Runtime 5.0.0.0 is missing 的库时出现错误。
这在 Visual Studio 中启动时有效,但在运行已发布代码时无效。
我已经使用 Blazor 服务器进行了尝试,效果很好。
我已尝试添加 false 以查看问题是否由链接引起,但问题仍然存在。
我已经在 net5、net5.0.1 和 net5 RC2 上尝试过。
任何建议将不胜感激。
提前致谢
我的 webassembly 中的代码是:
private static List<Assembly> LoadedAssemblies { get; set; }
public static async Task<List<Assembly>> GetAssemblies(HttpClient client)
{
if (LoadedAssemblies is null)
{
LoadedAssemblies = new List<Assembly>();
Console.WriteLine($"Running Version: {Runtime.FrameworkDescription}");
var files = System.Text.Json.JsonSerializer.Deserialize<string[]>(await (await client.GetAsync("/api/addons")).Content.ReadAsStringAsync());
Console.WriteLine(string.Join(',', files));
var allAssemblies = new List<Assembly>();
foreach (string dll in files)
{
var dllData = await client.GetStringAsync("/api/addons/" + dll);
allAssemblies.Add(Assembly.Load(Convert.FromBase64String(dllData)));
}
LoadedAssemblies = allAssemblies
.Where(w => w.GetTypes().Any(a => a.GetInterfaces().Contains(typeof(IModule)))).ToList();
}
return LoadedAssemblies;
}
public static async Task<IEnumerable<TypeInfo>> GetTypes<T>(HttpClient client)
{
return (await GetAssemblies(client)).SelectMany(a => a.DefinedTypes.Where(x => x.GetInterfaces().Contains(typeof(T))));
}
public static async Task<IEnumerable<T>> GetInstances<T>(HttpClient client)
{
List<T> instances = new List<T>();
foreach (Type implementation in await GetTypes<T>(client))
{
if (!implementation.GetTypeInfo().IsAbstract)
{
T instance = (T)Activator.CreateInstance(implementation);
instances.Add(instance);
}
}
return instances;
}
Chrome 错误是:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
IO_FileName_Name, System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
at System.Reflection.RuntimeModule.GetTypes()
at System.Reflection.Assembly.GetTypes()
at AssemblyScanning.<>c.<GetAssemblies>b__4_0(Assembly w)
at System.Linq.Enumerable.WhereListIterator`1[[System.Reflection.Assembly, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ToList()
at System.Linq.Enumerable.ToList[Assembly](IEnumerable`1 source)
at AssemblyScanning.GetAssemblies(HttpClient client)
at Dash.WMS.WebClient.Client.App.OnNavigateAsync(NavigationContext args)
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.Routing.Router.RunOnNavigateAsync(String path, Boolean isNavigationIntercepted)
at Microsoft.AspNetCore.Components.Routing.Router.<>c__DisplayClass61_0.<RunOnNavigateAsync>b__1(RenderTreeBuilder builder)
at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry renderQueueEntry)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
【问题讨论】:
-
您是否尝试清除缓存?
-
嗨。感谢您的答复。我做了是的。我尝试了几次,仍然没有成功。
-
发布完整的浏览器错误
-
嗨,抱歉。我已将此与我正在使用的代码一起添加到问题中。我应该添加从我的 API 作为 base64 编码字符串提供的 dll,然后我尝试加载它们。这是为了尝试开发基于插件的 UI。这有帮助吗?与 Visual Studio 使用的“开发”环境相比,我现在处于“生产”环境中,这与安全性有关吗?再次感谢!
-
只是补充一下,动态模块/dll在编译时不存在。如果它们在编译时在那里,我可以以这种方式加载任何 dll,但没有新的。
标签: reflection blazor blazor-client-side blazor-webassembly .net-5