IKVM 是一个.NET实现的java虚拟机及中间码翻译工具,它的0.34.0.2 Release版貎似有RPWT,用了一个Bruise传给我的hybrid-0.35.2769 才可以开始工作。
它能够实现的功能:
- 与Java.exe功能类似的java虚拟机ikvm.exe
- 通过ikvmc.exe将class文件或jar包转换成dll或exe文件(取决于类里边是否有main方法和参数设置),这时会作一些转换,包括:
- 类型的映射,比如将java.lang.Object映射到System.Object等
- 一些语言元素的对应转换,package对应namespace,jar文件对应dll文件
- 通过ikvmstub.exe来根据.net程序集生成对应的java存根类(有声明没有实现的类),使得引用到.net库的java代码能够被编译成.class文件。
已解决的问题:
- 将java类转换成dll程序集或exe文件,从而被用C#编写的类调用,或者独立运行。
C#貎似不能引用其它dll里的默认namespace里边的内容,所以java文件必须声明包,以便被转换成命名空间。<br>此外,因为 java中默认访问权限的方法会被转换成internal方法,所以在java中必须将这些方法显式地声明为public
已经发现的问题:
- 在java中,没有声明访问权限的方法默认是public的,但转换后的方法访问权限是internal的。
- 0.34.0.2 Release版的问题:当被编译的类中有main()方法时,ikvm会自动将其编译成exe文件,但这个exe文件不可执行。不过该版本将类库编译成dll貌似没有问题,而且ikvm.Runtime.dll等可以放进全局程序集缓存(GAC)。
- hybrid-0.35.2769版的问题:该版本编译生成exe没有问题,但IKVM.Runtime.dll等自身的dll文件无法放入GAC,比较麻烦。
- 在java部分使用了java.io.File类时会引发异常(仅测试了hybrid-0.35.2769版),( ikvmbin-hybrid-0.35.2777.zip
解决了这个问题)
异常输出
未处理的异常: System.TypeInitializationException: “java.lang.ClassLoader”的类
型初始值设定项引发异常。 ---> System.TypeInitializationException: “IKVM.NativeC
ode.java.lang.Thread”的类型初始值设定项引发异常。 ---> System.Reflection.Target
InvocationException: 调用的目标发生了异常。 ---> System.ArgumentNullException:
值不能为空。
在 System.Threading.Monitor.Enter(Object obj)
在 java.lang.ClassLoader.loadLibrary0(Class , File )
在 java.lang.ClassLoader.loadLibrary(Class , String , Boolean )
在 java.lang.Runtime.loadLibrary0(Class , String )
在 java.lang.System.loadLibrary(String libname)
在 java.lang.System.initializeSystemClass()
--- 内部异常堆栈跟踪的结尾 ---
在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] argum
ents, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle
typeOwner)
在 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] argume
nts, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwn
er)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisib
ilityChecks)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture)
在 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
在 IKVM.NativeCode.java.lang.Thread..cctor()
--- 内部异常堆栈跟踪的结尾 ---
在 IKVM.NativeCode.java.lang.ClassLoader.registerNatives()
在 java.lang.ClassLoader.registerNatives()
在 java.lang.ClassLoader..cctor()
--- 内部异常堆栈跟踪的结尾 ---
在 java.lang.ClassLoader.getCallerClassLoader()
在 java.lang.Class.forName(String className)
在 fileTest.FileTest.mkdir(String str)
在 FileTestMain.Main(String[] arg)
posted on 2007-08-10 16:46
踏雪赤兔 阅读(8239)
评论(7) 编辑 收藏 引用 所属分类:
玩转编程