Gephi 的 java 默认方法未在 C# 中使用 ikvm-from dll 库实现
Gephi's java default method not implemented in C# with an ikvm-from dll library
我对java的了解很少,所以我可能误解了我的问题:
我正在研究 Java 中的 Gephi API,我使用 IKVMC 来研究一个 dll。
我尝试按照 Gephi 文档中的说明创建一个空图 https://github.com/gephi/gephi/wiki/How-to-manipulate-Graph
在 C# 中我试过这个:
ProjectController pc;
pc = (ProjectController)org.openide.util.Lookup.getDefault().lookup(typeof(ProjectController));
在第二行出现以下错误:
Exception non gérée : System.TypeLoadException: La méthode 'thenComparing' du ty
pe 'org.openide.util.lookup.ALPairComparator' de l'assembly 'gephi-toolkit, Vers
ion=0.0.0.0, Culture=neutral, PublicKeyToken=null' n'a pas d'implémentation.
à org.openide.util.lookup.AbstractLookup.getPairsAsLHS()
à org.openide.util.lookup.MetaInfServicesLookup.beforeLookup(Template )
à org.openide.util.lookup.AbstractLookup.lookupItem(Template template)
à org.openide.util.lookup.AbstractLookup.lookup(Class clazz)
à org.openide.util.Lookup.getDefault()
à myproject ....
In english it quickly says that the thenComparing() method has no implemention for the type org.openide.util.lookup.ALPairComparator.
查了一下,反编译出来的dll,好像是这里的错误
internal LinkedHashSet getPairsAsLHS()
{
AbstractLookup.Storage storage = this.enterStorage();
LinkedHashSet result;
try
{
Enumeration enumeration = storage.lookup(ClassLiteral<Object>.Value);
TreeSet.__<clinit>();
TreeSet treeSet = new TreeSet(ALPairComparator.DEFAULT);
我发现thenComparing是一个"default"方法,在java8中,如果我没说错的话,已经实现了默认方法
我的项目引用了 IKVM 的 java.util 库。
所以可能是在 C# 中使用 ikvm 严重支持默认方法的实现或者 thenComparing 严重支持内部 ALPairComparator 类型可能是一个问题。
真诚地,我不知道它可能来自哪里,所以欢迎提供任何线索。如果您有任何问题或需要更精确的信息,请问我。
感谢您的帮助。
编辑:我注意到 Gephi 与 java 1.8 不兼容,但与 java 1.7
不兼容
EDIT2:我正在尝试用 IlSpy
上 java 1.7 上的旧版本替换我的 dll 中的 org.openide.util 包
我解决了
似乎是与 java 8 不兼容的 Gephi,所以我使用 IKVM 7 版本 serie 用于 java 7(在 nuget 可用)。
我在 IKVM 7.2 和 7.4 之间遇到了一些问题,它想加载 7.4 而我有 7.2。
最后我在 sourceforge 上使用 IKVM 7.2 制作了我的 dll(我的 Windows 环境路径指向 java 7 文件夹)并且我在我的 Visual Studio 项目中使用了 nuget 的 IKVM 7.4参考资料。
似乎工作正常。
我对java的了解很少,所以我可能误解了我的问题:
我正在研究 Java 中的 Gephi API,我使用 IKVMC 来研究一个 dll。
我尝试按照 Gephi 文档中的说明创建一个空图 https://github.com/gephi/gephi/wiki/How-to-manipulate-Graph
在 C# 中我试过这个:
ProjectController pc;
pc = (ProjectController)org.openide.util.Lookup.getDefault().lookup(typeof(ProjectController));
在第二行出现以下错误:
Exception non gérée : System.TypeLoadException: La méthode 'thenComparing' du ty pe 'org.openide.util.lookup.ALPairComparator' de l'assembly 'gephi-toolkit, Vers ion=0.0.0.0, Culture=neutral, PublicKeyToken=null' n'a pas d'implémentation. à org.openide.util.lookup.AbstractLookup.getPairsAsLHS() à org.openide.util.lookup.MetaInfServicesLookup.beforeLookup(Template ) à org.openide.util.lookup.AbstractLookup.lookupItem(Template template) à org.openide.util.lookup.AbstractLookup.lookup(Class clazz) à org.openide.util.Lookup.getDefault() à myproject ....
In english it quickly says that the thenComparing() method has no implemention for the type org.openide.util.lookup.ALPairComparator.
查了一下,反编译出来的dll,好像是这里的错误
internal LinkedHashSet getPairsAsLHS()
{
AbstractLookup.Storage storage = this.enterStorage();
LinkedHashSet result;
try
{
Enumeration enumeration = storage.lookup(ClassLiteral<Object>.Value);
TreeSet.__<clinit>();
TreeSet treeSet = new TreeSet(ALPairComparator.DEFAULT);
我发现thenComparing是一个"default"方法,在java8中,如果我没说错的话,已经实现了默认方法
我的项目引用了 IKVM 的 java.util 库。
所以可能是在 C# 中使用 ikvm 严重支持默认方法的实现或者 thenComparing 严重支持内部 ALPairComparator 类型可能是一个问题。
真诚地,我不知道它可能来自哪里,所以欢迎提供任何线索。如果您有任何问题或需要更精确的信息,请问我。
感谢您的帮助。
编辑:我注意到 Gephi 与 java 1.8 不兼容,但与 java 1.7
不兼容EDIT2:我正在尝试用 IlSpy
上 java 1.7 上的旧版本替换我的 dll 中的 org.openide.util 包我解决了
似乎是与 java 8 不兼容的 Gephi,所以我使用 IKVM 7 版本 serie 用于 java 7(在 nuget 可用)。
我在 IKVM 7.2 和 7.4 之间遇到了一些问题,它想加载 7.4 而我有 7.2。
最后我在 sourceforge 上使用 IKVM 7.2 制作了我的 dll(我的 Windows 环境路径指向 java 7 文件夹)并且我在我的 Visual Studio 项目中使用了 nuget 的 IKVM 7.4参考资料。
似乎工作正常。