如何在C#程序集中嵌入XSLT文件并获取对应路径
核心结论
嵌入程序集的资源没有独立的磁盘文件路径。这类资源是作为二进制数据段直接打包在exe/dll的程序集内部,不属于文件系统上的独立文件,不存在直接获取其原生文件路径的方法。
思路误区说明
你不想使用流读取的想法,本质是混淆了两类文件的生成配置差异:
- 若将Xslt文件生成操作设置为
内容并配置复制到输出目录,文件会作为独立项和exe存放在同一目录,可直接获取绝对/相对路径 - 若设置为嵌入资源,文件已经被编译进程序集二进制,不是磁盘上的单独文件,自然不存在独立路径
推荐实现方案(完全符合单exe打包需求)
XSLT加载本身不需要物理文件路径,XslCompiledTransform等原生XSLT处理类原生支持从流、XmlReader直接加载,全程不需要磁盘IO,不需要落地文件,代码示例:
using System.Reflection; using System.Xml; using System.Xml.Xsl; // 直接从嵌入资源流加载XSLT,无磁盘读写 var assembly = Assembly.GetExecutingAssembly(); using var xsltStream = assembly.GetManifestResourceStream("TimeSoft.Entities.Properties.Resources.general.Xslt"); using var xmlReader = XmlReader.Create(xsltStream); var xslt = new XslCompiledTransform(); xslt.Load(xmlReader);
如果你是通过Resources.resx管理嵌入资源,可以直接用强类型资源类访问,不需要手动拼写资源名:
using System.IO; using System.Xml; using System.Xml.Xsl; // 直接读取强类型资源内容 var xsltText = Properties.Resources.general; using var strReader = new StringReader(xsltText); using var xmlReader = XmlReader.Create(strReader); var xslt = new XslCompiledTransform(); xslt.Load(xmlReader);
折中方案(仅适配强制要求传文件路径的场景)
如果你调用的第三方组件仅支持传入文件路径、不支持流/文本入参,只能临时将嵌入资源写入磁盘临时目录获取路径,用完后删除临时文件,示例代码:
using System.Reflection; using System.IO; var assembly = Assembly.GetExecutingAssembly(); // 生成唯一临时文件路径 var tempXsltPath = Path.Combine(Path.GetTempPath(), $"general_{Guid.NewGuid():N}.xslt"); // 将嵌入资源写入临时文件 using (var resStream = assembly.GetManifestResourceStream("TimeSoft.Entities.Properties.Resources.general.Xslt")) using (var fs = File.Create(tempXsltPath)) { resStream.CopyTo(fs); } try { // 此处tempXsltPath即可作为文件路径传入需要的方法 CallMethodNeedXsltPath(tempXsltPath); } finally { // 用完清理临时文件 if (File.Exists(tempXsltPath)) File.Delete(tempXsltPath); }
注意:该方案会在磁盘生成临时文件,不符合你「所有依赖打包在exe内、无需读取磁盘文件」的初始需求,仅作为兼容特殊场景的备选。
内容的提问来源于stack exchange,提问作者Kübra Nur
相关产品推荐
相关产品推荐

