在Xamarin.Forms的.NET Standard2项目中用pdfHtml生成PDF遇assembly空值异常
解决Xamarin.Forms(.NET Standard 2)中pdfHtml生成PDF的Assembly空引用异常
问题根源
Xamarin.Forms的跨平台项目结构(共享库+平台专属项目)和.NET 6控制台环境差异很大,Assembly.GetExecutingAssembly()在共享项目中可能返回空或者错误的程序集,再加上资源嵌入配置、路径处理的问题,最终触发空引用异常。
具体修复步骤
确保资源嵌入配置正确
右键你的test.html文件→属性,把「生成操作」改成「嵌入的资源」。然后通过以下代码打印所有可用的资源名称,确认你的resourceName完全匹配:var assembly = typeof(YourSharedProjectClass).Assembly; foreach (var name in assembly.GetManifestResourceNames()) { Console.WriteLine(name); }资源名称格式是
[共享项目程序集名].[文件夹名].[文件名],比如你的共享项目叫MyApp.Shared,文件在Data文件夹下,资源名就是MyApp.Shared.Data.test.html。替换Assembly获取方式
不要用Assembly.GetExecutingAssembly(),改用共享项目中某个类的程序集,确保拿到的是包含嵌入资源的共享库程序集:// 把YourSharedProjectClass换成你共享项目里实际存在的类 var assembly = typeof(YourSharedProjectClass).Assembly;适配Xamarin的文件路径
Xamarin.Forms不能随便用自定义路径,要使用系统允许的存储目录,比如:string targetPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "output.pdf" );完善pdfHtml的转换配置
Xamarin环境下需要补充必要的配置,避免隐性错误:ConverterProperties converterProperties = new ConverterProperties(); // 启用内置字体,避免字体缺失问题 converterProperties.SetFontProvider(new DefaultFontProvider(true)); // 设置BaseUri,确保HTML中的相对资源能被解析 converterProperties.SetBaseUri(Path.GetDirectoryName(targetPath));
修正后的完整代码
using System.IO; using System.Reflection; using iText.Html2pdf; using iText.Html2pdf.Resolver.Font; // 替换成你共享项目中的实际类 var assembly = typeof(YourSharedClass).Assembly; var resourceName = "MyApp.Shared.Data.test.html"; // 替换成实际的资源名 // 获取合法的存储路径 string targetPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "output.pdf" ); using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) using (FileStream pdfDest = File.Open(targetPath, FileMode.Create)) { string result = reader.ReadToEnd(); ConverterProperties converterProperties = new ConverterProperties(); converterProperties.SetFontProvider(new DefaultFontProvider(true)); converterProperties.SetBaseUri(Path.GetDirectoryName(targetPath)); HtmlConverter.ConvertToPdf(result, pdfDest, converterProperties); }
内容的提问来源于stack exchange,提问作者rherzog
相关产品推荐
相关产品推荐

