在 IKVM 上运行 PlantUml Jar 失败并出现 System.TypeInitializationException

问题描述 投票:0回答:1

我尝试在.Net 中运行 PlantUml,而不是依赖本地/docker/外部安装的 Java 虚拟机来运行它。据我了解,IKVM 创建了一个在 .Net 本身中运行的 JVM,因此这将是我的问题的解决方案。

为了帮助任何想要尝试帮助解决问题的人,我创建了一个公共代码存储库https://github.com/lemonlion/PlantUmlIkvmTest

首先,我访问 https://plantuml.com/download 并下载了最新的 MIT 许可版本(

plantuml-mit-1.2023.13.jar
)。然后,我创建了一个名为
PlantUmlIkvm
的新 C# .Net 6 控制台项目,并添加了一个名为
PlantUml
的新文件夹,并将 jar 放入其中。

接下来我安装了IKVM自述文件中提到的所有软件包,并且我还安装了

IKVM.Maven.Sdk

    <ItemGroup>
        <PackageReference Include="IKVM" Version="8.7.3" />
        <PackageReference Include="IKVM.Image" Version="8.7.3" />
        <PackageReference Include="IKVM.Image.JDK" Version="8.7.3" />
        <PackageReference Include="IKVM.Image.JRE" Version="8.7.3" />
        <PackageReference Include="IKVM.Maven.Sdk" Version="1.6.5" />
        <PackageReference Include="IKVM.MSBuild" Version="8.7.3" />
    </ItemGroup>

接下来,我根据 IKVM 自述文件在项目文件中添加了 IkvmReference 标记。我还将“调试”设置为 true 以允许任何调试功能。

    <ItemGroup>
        <IkvmReference Include="PlantUml\plantuml-mit-1.2023.13.jar" >
            <Debug>true</Debug>
        </IkvmReference>
    </ItemGroup>

此时整个解决方案如下所示:

然后我重建了整个解决方案。我查看

C:/Code/PlantUmlIkvm/bin/Debug/net6.0
,很高兴看到已创建一个名为
net.sourceforge.plantuml.dll
的 dll,这表明 IKVM 已成功将 jar 转换为 .net 兼容的内容。

然后我尝试使用我的解决方案中的 PlantUml。除了一些智能感知的奇怪之处(IDE 并不总是将类识别为类)之外,新类似乎是由 Visual Studio 拾取的,我可以使用 Visual Studio/Resharper 反编译它们。我按照主页上的 PlantUml 教程从一些基本的 plantUml 创建 PNG 图像,因此我在主 Program.cs 中输入以下代码:

    using System.Reflection;
    using com.plantuml.api.cheerpj;
    using com.plantuml.api.cheerpj.v1;
    using java.io;
    using net.sourceforge.plantuml;
    using net.sourceforge.plantuml.api;
    using net.sourceforge.plantuml.security;
    using net.sourceforge.plantuml.sequencediagram;
    using sun.misc;
    using sun.net.www.content.image;

    namespace PlantUmlIkvm;

    public class Program
    {
        public static void Main(string[] args)
        {
            var uml = "@startuml\n";
            uml += "Bob -> Alice : hello\n";
            uml += "@enduml\n";
            var reader = new net.sourceforge.plantuml.SourceStringReader(uml);
            OutputStream png = new Base64OutputStream();
            var desc = reader.outputImage(png).getDescription();
        }
    }

程序构建成功。它在一定程度上成功运行,但在这一行失败:

var desc = reader.outputImage(png).getDescription();

线路失败并显示消息

System.TypeInitializationException: 'The type initializer for 'net.sourceforge.plantuml.FileFormat' threw an exception.'

外部异常目标站点:

内部异常目标站点:

主堆栈跟踪:

内部异常堆栈跟踪:

我相信当它尝试创建 FileFormatOption 时会发生错误,因此当我插入此附加行时,它首先会失败:

var fileFormat = new FileFormatOption(FileFormat.PNG);

我在 Windows 10 上运行这一切。

我想这更像是一个 IKVM 问题,而不是 PlantUml 问题,但欢迎任何想法。

java c# .net plantuml ikvm
1个回答
0
投票

与 IKVM 人员讨论后发现,PlantUml Jar 使用的是

AWT
,IKVM 目前不支持,尽管将来可能会支持。请参阅此处:https://github.com/ikvmnet/ikvm/issues/466

© www.soinside.com 2019 - 2024. All rights reserved.