【问题标题】:Blazor WebAssembly Reflection Missing System.RuntimeBlazor WebAssembly 反射缺少 System.Runtime
【发布时间】: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


【解决方案1】:

我在以下链接中找到了问题的根源:docs.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/... 我找到了很多关于修剪的文章,但错过了这个艺术的。修剪功能正在删除 system.runtime 库,因为它在运行时不需要!非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2020-06-05
    • 2020-04-03
    • 1970-01-01
    • 2014-05-24
    • 2019-11-16
    • 2020-08-19
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多