找回密码
 立即注册

QQ登录

只需一步,快速开始

Shawn.Liu 活字格认证
超级版主   /  发表于:2024-10-24 17:22  /   查看:314  /  回复:0
本帖最后由 Grayson.Shang 于 2024-10-24 18:11 编辑

不知道大家有没有这种时刻,比如使用活字格开发时间久了之后,有些功能需求想来想去只能动手通过代码来实现,这时想到利用服务端编程写Web API来实现此类需求,然后在活字格设计器中上传Web Api后调用即可。

大多数时候大家对于业务代码的编写都没有太多问题,因为有时候本身公司已经积累了许多这方面的使用经验,在开发Web API过程中遇到的主要是一些版本冲突类的问题,比如今天分享的某位用户开发实现的Excel转PDF功能,在开发阶段和发布到本地服务器都没有问题,正常调用和导出,但是在发布到正式服务器(Linux系统)之后调用报"The type initializer for '口口口口' threw an exception";
image.png421372069.png

本帖会分享在跟踪该问题时开发Web API的两个小技巧:添加诊断日志 和 解决程序集无法加载问题。

1、搭建复现环境
格友采用的是Aspose.Cells库实现该需求(以 PDF 格式保存文件 | Aspose.Cells .NET Excel 处理 API),版本20.12.0,如下图所示 :
image.png335568846.png
发布到CentOS服务器之后调用Web API可复现该问题,如下图所示:
image.png796005859.png

小技巧1:程序中添加诊断日志

(1)添加依赖:添加对 "活字格服务器安装路径\Website\bin\Forguncy.Log.Abstractions.dll" 的引用;
image.png114595336.png

(2)添加日志代码
  1. using GrapeCity.Forguncy.Log;

  2. // ......

  3. try {
  4.     // Excel 文件路径  
  5.     string excelFilePath = @"/tmp/work.xlsx";
  6.     // PDF 文件保存路径  
  7.     string pdfFilePath = @"/tmp/Test.pdf";

  8.     // 加载 Excel 文件  
  9.     Workbook workbook = new Workbook(excelFilePath);

  10.     // 这里可以配置 PDF 保存选项(如果需要的话)  
  11.     // PdfSaveOptions options = new PdfSaveOptions();  
  12.     // // 配置选项...  

  13.     // 将 Excel 保存为 PDF,这里直接使用默认选项  
  14.     workbook.Save(pdfFilePath, SaveFormat.Pdf);

  15.     // 释放资源  
  16.     workbook.Dispose();

  17.     Logger.Info("Excel 文件已成功转换为 PDF 文件!");
  18. } catch (Exception ex) {
  19.     Logger.Error(ex.Message.ToString());
  20. }

复制代码
(3)如果想要输入其他不同级别的日志,如调试级别、警告级别等,可在IDE中根据提示开发;

2、查询Aspose.Cell库产品官网,寻找相关解决的方法

幸运的是找到了最接近问题现象的文档,参考 在 .Net6 中运行 Aspose.Cells|Documentation 中的描述,可以看出是因为第一步库版本的原因。
image.png862865905.png

细节的格友已经看到第一张IDE截图中,当Aspose.Cells版本为20.12.0时,引用的图形库为System.Drawing.Common 4.7.0版本,对比上图中官网的描述,该库将只在Windows系统上有效,对应了我们刚开始的问题现象;

此时我们只需在IDE中升级引用的Aspose.Cells的版本到22.10.1即可:
image.png754765929.png

正常来说,到这里这个问题已经可以解决格友的问题,但是后面格友反馈遇到了新的问题:"Could not load file or assembly 'SkiaSharp, Version=2.88.0.0, Culture=neutral, PublicKeyToken=xxx'",无法加载文件或程序集SkiaSharp,出现该问题一般是因为第三方库(SkiaSharp)所引用的版本高于活字格当前版本引用该库的版本。

小技巧2:解决无法加载程序集问题

了解到格友使用的活字格版本为 9.0.103,在设计器上传Web Api时,SkiaSharp.dll版本为上图中的 2.88.0,高于活字格9.0.103版本所引用的SkiaSharp.dll版本 2.80.2;
image.png752197875.png


解决方法是在上传Web Api时不要上传 "WebApi开发路径\bin\Debug\net6.0\SkiaSharp.dll",而是上传 "活字格服务器安装路径\WebSite\bin\SkiaSharp.dll"即可。

无法加载程序集问题的原理和其他方法可参考插件开发教程中的描述:如何解决程序集无法加载的问题 - 活字格V10帮助文档 (grapecity.com.cn)

感谢大家的阅读。


0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部