我尝试在.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 问题,但欢迎任何想法。
与 IKVM 人员讨论后发现,PlantUml Jar 使用的是
AWT
,IKVM 目前不支持,尽管将来可能会支持。请参阅此处:https://github.com/ikvmnet/ikvm/issues/466