【问题标题】:How do I create a CSharpCompilation using Roslyn in Blazor WebAssembly?如何在 Blazor WebAssembly 中使用 Roslyn 创建 CSharpCompilation?
【发布时间】:2023-02-08 04:06:42
【问题描述】:

我正在尝试编写一个 Blazor WebAssembly (WASM) 应用程序,它接受一些代码(来自一些文本输入字段)并使用 Roslyn 编译代码。

我正在使用 Roslyn 的 CSharpCompilation 类来创建编译。它的Create 方法有四个参数,其中一个是MetadataReferences 的列表(又名程序集引用)。在其他(非 blazor)类型的应用程序中,例如 C# 控制台应用程序,您可以根据 Asssembly Location 获取这些 MetadataReferences,如下所示:

var locatedAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !string.IsNullOrEmpty(a.Location)).ToArray();
foreach (var assembly in locatedAssemblies) 
{
    MetadataReference reference = MetadataReference.CreateFromFile(assembly.Location);
}

不幸的是,这在 Blazor WASM 中不再有效,因为程序集的 Locations 是空的。

我曾尝试以不同的方式获取程序集,例如 AppDomain.CurrentDomain.GetAssemblies()Assembly.GetEntryAssembly().GetReferencedAssemblies(),但所有的 Locations 都是空的。我也试过拨打Assembly.Load(),但没有成功。

有谁知道如何在 Blazor WASM 中获取 MetadataReferences,或者我将如何在 Blazor WASM 中创建编译? (我也知道我可能需要使用 MetadataReference.CreateFromStream(),但它仍然需要装配位置)。

提前致谢。

【问题讨论】:

    标签: .net-core blazor .net-6.0 roslyn blazor-webassembly


    【解决方案1】:

    我还想在 Blazor WASM 应用程序中编译 C#,但发现您的问题没有答案。经过一些挖掘后,我能够创建一个工作演示(下面的 repo 链接。)基本上使用 HttpClient 获取每个程序集的字节并使用 MetadataReference.CreateFromImage(bytes)。

    我创建的完整基本示例回购:https://github.com/LostBeard/BlazorWASMScriptLoader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2020-10-12
      • 2021-11-05
      • 2021-02-18
      • 2023-01-20
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多