c# - Blazor - 此框架不支持“msxsl:script”元素,因为它不支持运行时代码生成
问题描述
我在 Blazor Webassembly 中使用 XslCompiledTransform 时遇到问题。
blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常渲染组件:此框架不支持“msxsl:script”元素,因为它不支持运行时代码生成
public async Task<string> TransformSomething(string xml, string kluczPakietu, string kodPakietu)
{
var xslFile = await _httpClient.GetByteArrayAsync("transform.xsl");
//change bytearray to string - valid is working here.
string transformataHTML = System.Text.Encoding.Default.GetString(xslFile);
XDocument oldDocument = XDocument.Parse(xml);
var newDocument = new XDocument();
using (var stringReader = new StringReader(transformataHTML))
{
using (XmlReader xsltReader = XmlReader.Create(stringReader))
{
XsltArgumentList argsList = new XsltArgumentList();
argsList.AddParam("SVG", "", "enabled");
argsList.AddParam("klucz", "", kluczPakietu);
argsList.AddParam("kod", "", kodPakietu);
XsltSettings xsltSettings = new XsltSettings();
xsltSettings.EnableDocumentFunction = true;
xsltSettings.EnableScript = true;
var transformer = new XslCompiledTransform();
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltReader);
//here is exception
transformer.Load(xsltReader, xsltSettings, new XmlUrlResolver());
//transformer.Load(xsltReader);
using (XmlReader oldDocumentReader = oldDocument.CreateReader())
{
using (XmlWriter newDocumentWriter = newDocument.CreateWriter())
{
transformer.Transform(oldDocumentReader, argsList, newDocumentWriter);
}
}
}
}
return newDocument.ToString();
}
是否可以在 Blazor Webassembly 中完成?在 Blazor 服务器端,脚本有效。
解决方案
XslCompiledTransform
将尝试在运行时生成新的 .NET 代码,并期望 JIT 将其编译为底层机器的本机代码。由于 WebAssembly 不支持这一点(就像其他需要 AOT 的平台,如 iOS),你不能使用它。
在这些平台上使用XslTransform
该类而不是XslCompiledTransform
使用 XSLT。
更新:另请注意,XSLT 中的脚本始终需要生成运行时代码,因此即使XslCompiledTransform
会退回到非编译转换,脚本目前仅用于生成运行时代码:
XslCompiledTransform 类支持使用 msxsl:script 元素的嵌入式脚本。加载样式表时,任何定义的函数都由代码文档对象模型 (CodeDOM) 编译为 Microsoft 中间语言 (MSIL) 并在运行时执行。从嵌入脚本块生成的程序集与为样式表生成的程序集是分开的。
推荐阅读
- c - 从递归函数中提早释放
- java - 错误:找不到符号“tri.CalArea();”
- mysql - 比较mysql触发器中两个表之间的新插入值
- fable-f# - 获取 StringEnum 的名称
- seaborn - 如何使用 Seaborn 为散点图设置自定义 y_scale
- amazon-web-services - 如何修复加载资源失败:服务器响应状态为 405(不允许方法)Vue.js AWS
- java - 下载的大文件的堆外存储
- ios - 如何在收藏视图中实现视频播放?
- visual-studio-code - 为什么从 vs 代码扩展 XD 完成对 DSP 的编辑,而不是生成 CSS、JS 等?
- swift - 如何在 Swift 中以编程方式绘制李萨如曲线?