使用dotnet-script运行C#脚本时出现CLS合规性错误求助
解决dotnet-script中XmlSerializer的CLS合规错误及CS1730问题
问题根源
dotnet-script会把脚本编译成名为Submission#0的动态程序集,这个名称里的#字符不符合CLS(公共语言规范),而XmlSerializer在生成反序列化代码时会校验程序集的CLS合规性,因此抛出Identifier 'Submission#0' is not CLS-compliant错误。
你遇到的CS1730错误,是因为程序集属性[assembly:CLSCompliant(true)]必须放在脚本的最顶部——任何using语句、类定义之前,否则编译器会判定属性位置非法。
解决方案
方案1:指定合法的程序集名称(推荐)
运行dotnet-script时,通过--assembly-name参数指定一个不含特殊字符的合法程序集名称,让动态程序集符合CLS规范,无需修改脚本代码:
dotnet script YourScript.csx --assembly-name MyValidAssemblyName
方案2:正确放置CLS属性+调整XmlSerializer配置
如果无法修改运行命令,先修正属性位置,再通过配置跳过CLS校验:
- 把CLS合规属性放在脚本最开头:
[assembly: CLSCompliant(true)] using System; using System.Xml.Serialization; using System.IO; // 你的模型类 public class FilesModel { // 模型属性定义 } public static FilesModel GetFilesModel(string xmlContent) { var serializer = new XmlSerializer(typeof(FilesModel)); using var reader = new StringReader(xmlContent); return (FilesModel)serializer.Deserialize(reader); }
- 若仍报错,改用
XmlAttributeOverrides强制跳过CLS校验:
public static FilesModel GetFilesModel(string xmlContent) { var overrides = new XmlAttributeOverrides(); var serializer = new XmlSerializer(typeof(FilesModel), overrides); using var reader = new StringReader(xmlContent); return (FilesModel)serializer.Deserialize(reader); }
方案3:替换XmlSerializer为其他序列化库
如果上述方法无效,换用不校验CLS合规的序列化方式,比如DataContractSerializer:
using System.Runtime.Serialization; using System.Xml; using System.IO; [DataContract] public class FilesModel { [DataMember] public string FilePath { get; set; } // 其他属性 } public static FilesModel GetFilesModel(string xmlContent) { var serializer = new DataContractSerializer(typeof(FilesModel)); using var reader = new StringReader(xmlContent); using var xmlReader = XmlReader.Create(reader); return (FilesModel)serializer.ReadObject(xmlReader); }
本地运行正常的原因
本地直接编译运行时,生成的程序集名称是项目/脚本的合法名称(不含#这类特殊字符),天然符合CLS规范,因此XmlSerializer不会触发错误。
内容的提问来源于stack exchange,提问作者pawelek91
相关产品推荐
相关产品推荐

