【发布时间】:2021-02-22 05:25:05
【问题描述】:
我有一个在服务器上按预期工作的代码,它动态生成 C# 代码然后运行它。要运行代码,我使用以下代码:
string assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
MetadataReference[] references = new MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
MetadataReference.CreateFromFile(typeof(RunResult).Assembly.Location),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Console.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.Extensions.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Collections.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Text.Json.dll"))
};
var f =
await CSharpScript.Create(
code: code,
options: ScriptOptions.Default.WithReferences(references))
.ContinueWith<Func<RunResult, bool>>("new EvaluatorClass().Run")
.CreateDelegate()
.Invoke();
await using (MemoryStream ms = new MemoryStream())
{
await using (StreamWriter currentOut = new StreamWriter(ms) { AutoFlush = true })
{
var runResult = f(codeResult);
}
}
我已将此代码编写为 .NET Standard 库的一部分,现在我想使用 Blazor WebAssembly 在客户端运行它。
当我调试时,我发现问题在于 string assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location); 返回 null,因此(据我所知)不可能包含正在执行的代码所需的引用。
是否有其他方法可以实现这一点,以便在 Blazor 上运行?
【问题讨论】:
-
您必须了解,任何 WASM 应用程序都完全运行在客户端,在 web 浏览器中。它在一个容器中。没有办法以这种方式访问本地文件系统(这将是一个很大的安全风险)。
-
@JHBonarius 我意识到了这一点。但我原以为作为 WASM 下载到浏览器的 .NET FW 可能会克服这种情况。
-
我还尝试让这些 DLL 成为嵌入式资源并从流中获取 MetadataReference - 它再次在服务器上工作,但在 WASM 上工作,原因不明
标签: c# blazor blazor-webassembly blazor-client-side