利用IKVM在C#中调Java程序

时间:2023-03-08 17:11:58

原文转自:http://luanxiyuan.iteye.com/blog/1937081

IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序。本文将比较详细的介绍这个工具的原理、使用入门(如何java应用转换为.NET应用、),希望能给大家带来惊喜。如果只想知道怎么使用的请直接跳转到第五步使用入门。

一、介绍

  IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序。它包含了以下的组建:

一个用.NET实现的java虚拟机

一个java类库的.NET实现

致力于在java和.NET之间交互的工具

二、IKVM.NET的组件

  IKVM.NET包含以下的部分

IKVM.Runtime.dll VM运行时和所有支持代码。它包括以下的功能:

Byte Code JIT 编译器和验证器 使用JIT将Java Byte Code编译为CIL(C中间语言)。

对象模式映射结构 将.NET中的System.Object,System.String,System.Exception映射为java代码中的java.lang.Object, java.lang.String,java.lang.Throwable。

管理本地方法(在Classpath中)的.NET重新实现。

IKVM.GNU.Classpath.dll 被编译的GNU Classpath版本,它是由*软件基金会实现的java类库和一些IKVM.NET附加代码组成的。注意:这里的GNU Classpath不是IKVM.NET的一部分,但是前者被用在IK.VM.NET中。

IKVM.JNI.

.dll 通过实现JNI接口管理C++汇编。作为一个可选部分,只在程序使用自己的本地库时才被用到。而对于纯java程序来讲是不会被用到的。

ikvm.exe 与java.exe很类似的启动执行程序(动态模式)。

ikvmc.exe 静态编译器,被用来编译java类和jar使其成为.NET汇编(静态模式)。

ikvmstub.exe 一个从.NET汇编生成存根类的工具,就如javap一样反编译.NET汇编。IKVM.NET了解如何存根并用实际的.NET类型引用替换对存根的引用。

IKVM.AWT.WinForms.dll 非常有限的零散AWT实现。

三、IKVM原理

1.如何替换JVM

  IKVM应用包含了采用.NET实现的java虚拟机。在一些场合,我们可以用它替换掉java。例如: java -jar myapp.jar 将被替换为 ikvm -jar myapp.jar。

2.在.NET应用中使用java类库

  IKVM.NET包含ikvmc,这个在java bytecode与.NET中间语言的转换器。如果我们使用一个被用在.NET平台的java库的话, 运行ikvmc –targetlibrary mylib.jar(mylib.jar在这里指代我们的jar文件)来生成mylib.dll。例如apache FOP项目是一个开源的XSL-FO处理器项目,它使用java语言编写的用于从xml生成PDF文档。使用IKVM.NET技术,我们可以将apache FOP用在任何的.NET应用中。这样在开发.NET应用的同时利用IKVM便可以使用java开源项目这个免费的软件仓库。尽管在IKVM.NET没有提供在.NET中使用的java编译器,但是我们可用开源的Jikes编译器将java源代码编译为JVM bytecode,然后使用ikvmc –targetexe myapp.jar来生产.NET执行文件。我们甚至可以通过包含ikvmstub应用的方式在我们的java代码中用.NET API。

四 语法(译者注:这个工具是在windows命令提示窗中使用的)

ikvmc [ options ] classOrJarfile [ classOrJarfile ... ]

参数见下。

类文件(.class)或包文件(.jar)

Java类或包文件的名字可以含有通配符(如*.class)。

参数----参数说明

-out:输出文件----指定输出文件的文件名。文件名应含有扩展名.dll(参数-target设为library时)或.exe(参数-target设为exe或winexe时)。一般地,缺省状态下ikvmc会根据输入文件名和-target参数来确定输出文件名。但是,如果在输入文件名中使用了通配符,那么就必须使用这个选项来指定输出文件名。

-assembly:程序集名称----指定生成的程序集名称。一般地,缺省状态下,程序集名就是输出文件名。

-target:目标类型----指定生成目标.exe或.dll文件的类型,可以指定如下值:

exe——生成一个在windows命令窗口中运行的可执行程序。 
      winexe——生成一个带有界面的.exe应用程序。 
       library——生成一个动态链接库(.dll)文件。 
       module——生成一个.net模块。 
       在Linux平台上,exe与winexe两个参数是没有区别的。

-keyfile:主文件名----主文件名用于指定结果程序集。

-version:M.m.b.r   ----指定程序集版本。

-main:类名----指定含有main函数的类的名称。缺省情况下,如果-target参数设置为exe或winexe,ikvmc会搜寻合法的main函数,在找到的情况下会给用户提示。

-reference:----指定类库位置 。 如果Java代码使用了.NET的编程接口(API),那么使用这个选项指定这些动态链接库(dll)。如果引用了不止一个类库文件,那么此选项可以多次使用。可以使用通配符(例如:c:\libs\*.dll)。

- recurse:filespec---- 处理当前文件夹下所有可与filespec匹配的文件。例如:- recurse: *.class

-nojni----对于非Java函数(native methods)不要生成用于非Java代码的Java接口(JNI)。

-resource:路径名----指定Java资源的引用路径名。

-exclude:文件名---- 要排除的类名列表。

-debug----将调试信息输出。注意:只有当.class文件含有调试信息(即使用javac-g参数编译)时才有用。

-srcpath:路径----指定源代码的位置。与-debug同时使用。程序会将包中类的搜索路径指定为此路径,并从中搜索类的源代码。

-Xtrace:名称---- 显示所有该指定名称的跟踪点。

-Xmethodtrace:函数名 ---- 指定的生成的函数名,将函数跟踪器(method trace)生成到此函数中。

几点说明:

ikvmc利用Java类文件和包文件生成.NET程序集。它将输入文件中的Java二进行代码转化成.NET公共中间语言(CIL)。并利用它来生成:

.NET可执行文件(-target:exe or –target:winexe) 
       .NET类库(-target:library) 
       .NET模块(-target:module) 
Java程序一般由一系列的包文件组成。ikvmc可以将多个包文件(和类文件)转化成一个单独的.NET可执行程序或类库文件。例如,一个程序包含main.jar、lib1.jar和lib2.jar可以转化成一个单独的main.exe文件。

处理多个包文件时,如果有多个相同的类或源文件,ikvmc会使用第一个读入的版本,而忽略以后读到的。这时会产生警告信息。因此,包文件的顺序至关重要。

注意:

为了得到最佳结果,使用ikvmc转换Java程序时,请按照Java程序中类路径的顺序在,把要转换包的列表键入ikvmc的命令行。

五 使用入门

  1. IKVM官方网站下载IKVM需要的组件 1) ikvm-0.40.0.1.zip   ;2)ikvmbin-0.40.0.1.zip ;3)openjdk6-b12-stripped.zip。

    下载0.40.0.1版本具体地址:http://sourceforge.net/projects/ikvm/files/ikvm/0.40.0.1/,可以看到下面三个文件,点击之后跳转到相应页面下载即可:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArYAAAGeCAIAAADudtV9AAAgAElEQVR4nO2923Mb153vi6fMmbfJ2f/Aruw6j8lUWXxg1anau2Y7T7vKZceq3ns7qZGYoYu2lMk+FoWYZ09GiaJIQ4c2SQhjJ9HILs9xhrqAhBTLgoYKHcumCQoUIdkiY0kkJFIURZpSZJMUBQIgSPZ56Nu69QVAN7oBfD/FkoDV6/Jbqy+/b//W6kZIBgAAAADgCPltAAAAAACCCCQCAAAAAARAIgAAAABAACQCAAAAAAT4IxESRySdH79z3fE2lfy1d155Qc/0wp6eDxdl+dHZnxtp0qsnZu3NuP7Oj41ajiTyAhNeePXEtJMe5UfffMnObDsbXnjl+PiaVV6nw2aDWrSEEnxhAAAAdU/tSYT8tRP/u8XI0nIksahuSBwhNML+39m6djOFMHviVcIn7jqSeGTboekTrxJtv/DaoG0JkRGS9MIr71zLm+aFRAAAAFA9gi0RDp1j/eVi4gihD2iPWqJGIJ3zrjc+zAs3SJIkvfTbK9Y1PUoc2UWVOJJwMgrCxgjNwwGJAAAAoHoEWyIwrnbxw549xAQDd8ed//ANwlXbaARThcD7zhd+ftYqkMB5+VL8KF9YeuHAgFgkVDg/4wSXqgEAAFD71I5EYBYgvPLmMO9HaY1g6eKu/NZYO7Cr5yOyknOHWKdtFUig21T40fFrTodCIBFM5xsgEQAAAFSPGpEIwgWKIkbffNGRYycVApNN6LRNVyRM/24/n7uEmQaytRdfNIwXzTdAIgAAAKgetSAR6AWKL7S+ZjpZL9O+31wjWCgEUmW8+NJLujARzlvkP+rRLXvhBUPE8IsozCAlwo+PnzCqk3YdOsf0ExIBAABA9Qi8RMjfHPi58AEGM6jb+hffHBXlIWMNnOsnDPjxO2cNLdHS8xHr94kHLV949cTvyIJOvSslEd65Tj08yc43QCIAAACoHgGXCOdIjym1HDl31/7unNII9DIDlY96jNUDnEIglyK88q9fLA4c0FUAu2qRcO8tPR/lCcudL0ZgJAIzp0KLBEgEAAAA1SPYEmH/fsPbt/x84Kaz6D31EiX6YQVZlimFIHhWgfTZRxL0XAKlJ8h1ivt/N00rD8eLETiJIDNvWXjpzVGtA2489GhjGCQCAAAAlWBLBIMfdv/R8sWDFNRDBqxGIDeSL0zSYCUCFZYgKiOEiLqWkS/pAJFEYF7/0PLa4KMyh40HEgEAAIAzakUiSNILe3ouOphmkGWZ0Qi0DiA3CSIMwicqiDJ62IHQDdp6R7G3t8GskEgkQCIAAACoHsGWCAdee41YqihJP9j/jvWvGOiQjyyQGoF8A6P4eQfhQ5dEdcpkg5FgvOiIfHFzxRJBlh8NvsaIBKxFAAAAUD2CLRGOJPJ3z73WSrxW2eqdCBTkokVDI5DLFMRvXyT9PPFbC8SqxVdPzBJhBTISQZguXCYpwir0QC6DkF56c/QcJAIAAICqEXSJIMuyvDb+O/KHm+zejKBCqgFNI5APKZq8VNnMZROq4MDpc/pnynqLd0ebYj07Qb134ec/PwCJAAAAoFrUgkSQZfbnGRypBH5dogOFYOGy9bmFH7/66i5hLe5LBEokkO9mgkQAAADgMbUiEWRZXhx+8xVSJbxy3G5dArGCYFfPR/KjAf0uXPAaJJXB14w2GNOohykliV/uSL6Ryal/pX6RWvgj0tR0AyQCAACAKlFDEkEWqAThrx0ZkI8r9iQMhWDxI5Bk86+emKW2Mb/YxLnQch5poH4RwiT0QC1chEQAAABQFYItEQ4McLMB1MOAti9kJl9esIt7cNHONN5jE3EJm7cuUe9XXPww8vc/kCRJeuFvW9sj1HJLJxJBJBIgEQAAAHhLsCWC0EnRv/pIPHQohPpZJ0UriN6GoEE+0FDC7zUqmLl78rWLEvOwpTOJQD1SYTtstpg7f0gEAAAAKjUoEWQ2lPDCK/9q4cvYX2u2+IVo2bnHFvLFv77imURgXssMiQAAAMBjalMiyDL1i4jWIuFR4gjxqkWrSQa5QolgOktR8USDLMuynL923HytAyQCAAAAd/FHIgAAAAAg4EAiAAAAAEAAJAIA9cD2woLfJgAA6g1IBADqAUgEAIDrQCIAUPNAHwAAvAASAYCaZ/vWLb9NAADUIZAIANQ2W+fP+20CAKA+gUQAoIbZXl3d+vhjv60AANQnVZcI8/Ew/RqfaMqLJrha+URhNm9IRctoabm7d7B7SfkQC3XEmoaWjY1Lk00dyQSZzUgBDQRCCAAA7/BFIhDucj4elsLxeS+bMEsMukTQcOj7IREaD4QQAACe4rdEkOfj4XB8Xvk/Gg3rYYVUlIkykAWpSrSc4WhUr0qKRqnyXG1sCp/ByKcmaZaWYhtRiWaQ3h5VraCUEh6Ya+2IhTpioY7B7onJpt5ka28s1JFMsFEEPZuSyHyV5SWirCzLE8kQkwHUIJunT/ttAgCgnvFbIuh+dz4eph244Y6NDAI3TOWUdIlgWdy6EiaokYrqm5QPzm0j6pDYnFy1HNwMwtJkU0esdUKWZZuJhkSfOisxPTQY6puTmbLyXKuW08gAao3thQXMMgAAPMX/tQgiF04G5jU/LHbDZE4iIMHntJIIouYMVB9OKASHtpFV8H1jquURSgQiKmAqEeZaO5RFDLKhBqhpCDIDqFU233nHbxMAAHWO31EE/bupl7Vz/IaHLVciCJuj8oXj85ord24bAakDNIlAVyugEokQCxl/osWMS5NN5FZQayCEAACoAr5LBM1lBjeKIM/Hw9Go7sorjCIYm+lqeSqRCNwKA7PFjBPJUO/ktIkFILAUDx/22wQAQP3ju0QQeVnx4gDjE7luwWQtQkkSwXItgsw+duHcNrKThi6gbLN4mqNsiWCsRTAUAFmWlAWQCDXI1tWrCCEAAKqA/2sRjIX9rHRgHzHQi4bjcfpWXskYtwz7K6XZOQ7bJxq0nOXZZhTQnmggNQFRrekTDY4lgvr6BGauQZtHoKMIib4YnmioXYodHX6bAABoCOro7YreveeAUQhVqtbhokKsPWwstq5e3Xz7bb+tAAA0BLUuEcighNuvYDIacL9m62qnhwZDHTHbKQCH2UA9Udy7d3t11W8rAAANQa1LBAAaiK3z5xFCAABUDUgEAGqGjV27EEIAAFQNSAQAagOEEAAAVQYSAYAaYHt1deO55xBCAABUE0gEAGqAzbffRggBAFBlIBEACDoIIQAAfAESAYCggxACAMAXIBEACDTbCwsIIQAAfAESAYBAUzx8GD/aBADwBUgEAILL9sJCsbl5e2HBb0MAAI0IJAIAwQUhBACAj0AiABBQtqemEEIAAPgIJAIAAaX4ox8hhAAA8BEfJEKhUJiZmZmcnEwDAEy4efJksbn5+uCg34YAABqXakuEfD4/MTHx4MGDbDZb5aYBqCEQQgAA+E5VJcLm5ubMzMzCwsI2AMCczY8/LjY3b92/77chAICGpqoSIZfLTUxM5PN5v3sNQKDZ+N73iocP+20FAKDRqapEePLkSTqd9rvLAASazQ8+QAgBABAEqioRHj9+nE6ntwAA5mx873sbv/yl31YAAMAWJAIAAaJ48mSxubk4Pu63IQAA4IdE2AQAiCh+/fXGd7+7sWeP34YAAMDm5uYmJAIAQWHjX/5FCSH4bQgAAGxuQiIAEBAQQgAABA0fJEIRAMCx0dNTbG7euHLFb0MAAEAFEsF9FhYW/DaBImj2VEhddmdjbq7Y3LyxZ4/f5gSIOtvRQoLfxyBbGGTb6gZIBPcJ2oEbNHsqpC67s/HLXyKEwFBnO1pI8PsYZAuDbFvd4INE2Kh3FhYW/DaBImj2VEj9dadw964SQvDblmBRZztaSPD7GGQLg2xb3QCJ4D5BO3CDZk+F1GF3Xn212NxcGBvz25ZgUWc7Wkjw+xhkC4NsW93gg0Qo1DsLCwvlFPt8+Dsd5/7p80KhkPmnzth3TmV8tqck4u07drTHPW+mUKhOd6rIg4sXlRCCy/WmIzt37IykqU+e7CbPdn25O5rob0nb/CD4B7PHFqYjO8s/etyxTT+AhQdHFa9swSSAEiEd2blDJ0ins1McHLjpH3TEQsTfDy76KhGoIS/rjAiaRPD1ICrJDz158cVic3Phww+t6+MG1+7a6olEEDVqUWdlDtluR8fbd3DsjKTdkQhV0hKODuZ4O3sQx9urdlA7dsPk7nB+jHkqESwPd30PQyJYEjiJEG+vTV1A4EwiKGpAiC8SQT8N0pGdgT4pHAyvzweRc/eST6WKzc0bzz1nmSvevrO9vZ2ukHcbLpjjqKoSDg1vJUI5rdSuRKD2dtAkQjqyk7QvHWl3ap2nEoHZienITnoMmZaDFmIKBj5IhLwV45GdO3ZGxq1SB9p37GgfUFOJ24eIoWLbB4xy1jnyA3wakbQzMq43p20zvpiwsLBgkyOf/n7HuSOf02mfD39HTcwc6Yx951RGTb94UQs26EUyRzrV8IORrRJ7xiM7yW6RXSaGUEmi99B4ZOfOyDhdhBhAJSNVZDyykx9Oo4Tt6DrsDn8Qsb0ybCPufgaIKgTJdO+EudsH2K8WFPbsKTY358+etenOzsj4QDtR1XhkZ/vAQDt1TgiOfW74jTEYIG/BqcGitjDmMwcKO67s0HADUcp+dnIeMT0VfacPRmYseMO1gpzpRgJ/aOXz+fzSH97q0Dl06poj0531caB9x87IQIS+BpInFD/q1TzdFAvENZmMGnWMmV84KraNuizRZhqjRDkU7uCgr/8NSNAkAnXi6phLBDWVzCBONslBNUFcPc0dpisnlWOJYCTm8xcvhjqHr+Xz106dC/3GZhhLs8dUIhB91/OQmTWFQGQkB1e7khFFqPNUvWSRFzw3uiM+iMwlAuUW+F6QJg+07yB7J5RNJhKF5+zZYnNz7plnbLKpg0wrgvYBkVwV9sBUIhC7hOwT3z+qftNx5XcjMxCl7Wc3JALXBW2b2eVAN1GwS23O/NUL//g3in9r3nX8T44sL0UijJM2GCNpc4ZW43QzVQjkBpNLMWGrcDdUaBuzm9sjxvVbcCqIDg5IBB8kQs6GK72Gft/Ze0VLUj/mcgP7duzYN8CkXundqSRSn+1z0M0qaXoDOabB3JXenWwxAQsLC3ZZ0t8n1yJ0Dl/N5XKfDX+n49yRz3K53PSRzth3Tk7ncrmrJ8+FfpMmSp078lnu6slzoY6LMVs7nNtDjceV3p07jJHQh93IRI2vup3aKcYYaRUYQziwb+dOYqD3DaiFjXYq705OeBCRu9U4MKhDi+6jIJkaELPc7FczCs89V2xu/urf/s0mn9bold59Wk+0QeWORtGxT5hD7ocdgtOB6h97HuTEJ46ejd+NzECUtp+d7Wi+FeI7vbv0bfv27dxBH+/8ESvYpfxoM8y891Lzjh07/tvhj1YcGZ5z2Ee9G+RQC3pIHqZVPN3MDnfmYCFH1kgWXFWoLldoG3vt1q9YopNCcHAIz4LGIoASwUA/lp1JBP6zfY7cwD4i4sWciKQd+wacKgSHEkFRAwQiiRD7DbWqMaSXGrxoaIvK7SEd6g7addAY3kcdD21EKT9BQY/pwL6dvVfUaxXp4tSmXBpeEv0gcioRBB5C+2YmBcqQCEoIofDss44uc7qtylWO8+eCo7hEiSDoR6kSIcftRn4gStjPlUsEwX7QD2nKGwmOWEFZJaPljr3Su/O/7Bso4fgsTSLoH0l3KzpDq3q6mckn5vgxbCKTKVkjuHBUaBt37dauWczJozuUHey4QCJUXyKsO6d/344d+/qVD8/3XmESr/Q+r6eKP9vm0OsitxOJKld6n9+xr/9K7/N0sgkLCwt2Wca/3/H+4Wt02rVPvq0mTh3ujH375NT6+vrVk++Hfj1uVsvVk++HOj+5Wrk9Sv/W19eVzpNDrX/m81/pfV68U0SjpFTVv08b9n39/fu4jPzIl9UdcaWkZeJDhMhjkkwPiElu9itPdmlJCSHkzpyx747R6JXe5/f16kehni48ioVdNHKSQ00d+obhgr0h2rt8NuEZal1EhNMdzbZi0h1yW/++HdSQ8caYmW6zb5evXZtwZLSKoz6S3VCsJXe90Jqqnm5Xep8XVcQMrGYqnUydQ44ur6XbpuxwY3c/33uFbI09XMmDw+mxWscEWiIY7spqj66vm352SyIoJ4HTQ8VFibB+7ZNvd1yMmVUzeDFksdW5PfTpSfTfSiNQ42GUsdAIO3aQrkpQs61vddYdrl3ucmoiEeheCJIpBWWSe93+spL7zW+UEIKT7rCm8J/dkwhUctkSwfJU4rpkSuUSgW+fNo2/uFh1yzq9PEqWCMq358kemmmEKp5uTAPqzRQpHYi2KEVhDH4ZGsGJbVd6n9+xbx+hj670Pv/8vn1EWwKHQpzmkAgBkwiq71Fh7syIcJpLEkE7laj2hAeF2akooGKJoPj+2PcH9XRtouHX4+vr67FfG1MPap4K7WHPTnKsiAGy8ILUV3Jf0fcL5M0QdWMkaqKi7ggPIsHONslrWgVZCdVhKo9RnO9Qdmlp47vfVUIITrpjeulklIugY9Q+3NfvQCIITzSzkVWaIqM0FuP4fG9/afvZDYlAD82+fvGoiI9Yah+SA+ymwyhDIqiGCXtoFsry9HTjqxXvf+H5wZ1HpYyyI9uu9D4vOoMFtzc2p0yD4oNEyNYisX079sUc5l1YWPDUllIJmj0V4m53xnqe3/F8z5jDZDfQQwjK18DunbGe550f814Q2JFxkeD3McgWBtm2ugESwYaYItFLcRdBO3CDZk+F1LREePLll3oIQUkJ1t6JEXfLHkkkxwRrZLwh+H0MsoVBtq1u8EEiPKl3FhYW/DaBImj2VEhNdyd38GCxuXnj6af1lJrujqc0wsgEv49BtjDIttUNkAjuE7QDN2j2VEgNdyeTKTY3F5ub13/9az2thrvjMY0wMsHvY5AtDLJtdQMkAgBVQg8hrC0u+m0LAADY44NEWAOgAZme1kMIfpsCAACOgEQAoBrkX35ZCSE8Xljw2xYAAHAEJAIAnvNkZAQhBABAzeGDRHgMQIOhhxBW79/32xYAAHAKJAIA3rL26adKCCH71lt+2wIAACXgg0RYBaCRUH6xaePpp1fm5/22BQAASqDaEuH69euPHj3yu9cAVIkn/f16CMFvWwAAoDSqKhHW1tamp6fn5ub87jUAVQIhBABA7VJViZDL5RYXF9Pp9N27d1cAqHfWYjE1hPCzn/ltCwAAlExVJcLm5uby8vL8/PydO3c+++yzNAD1y7VPPsn9zd8oEuH64KDf5gAAQMlUVSJsb29vbGwoKiGTyUwBUL88+NWvFH3w6Cc/8dsWAAAoh6pKBEUlFAqF5eXlpaWlxcXFBQDqklu3Ck8/rUiEL69d89saAAAoh2pLBAAagc2331b0QfHwYb9tAQCAMoFEAMBlthcWVH3Q3Ly9sOC3OQAAUCaQCAC4TPHwYYQQAAB1ACQCAG6CEAIAoG6ARADATRBCAADUDZAIALjG1tWrCCEAAOoGSAQAXKP4ox8hhAAAqBsgEQBwBzKEsHX1qt/mAABApUAiAOAORghh716/bQEAABeARADABbY++QQhBABAnQGJAIALbHzvewghAADqDEgEACpl6/x5hBAAAPUHJAIAlYIQAgCgLoFEAKAijF9sQggBAFBfQCIAUD7bq6sb3/0uQggAgLoEEgGA8kEIAQBQx0AiAFAmCCEAAOobSAQAymQzEjFCCB9/7Lc5AADgMpAIAJQD+aPPG88957c5AADgPpAIAJSD8aPPzc1b58/7bQ4AALgPJAIAJYMQAgCgEYBEAKBkih0dCCEAAOoeSAQASoP80WeEEAAAdQwkAgClYfzoM0IIAIC6BhIBgBJACAEA0DhAIgBQAhu7diGEAABoECARAHAK+aPPCCEAAOoeSAQAnGL86DNCCACABgASAQBHUCGEp5/eXl312yIAAPAWSAQA7NleXSVDCJtvv+23RQAA4DmQCADYQ/7oM0IIAIAGARIBABuoH31GCAEA0DBUXSLMx8NSNOVu+UrrlFNRSZIkKRyfd88or0r5SPndVBEVnmvtiIXIv745N2wVstzdGwt1JBMlFuNCCPdM6iHrn2vtiIV6J6ddMdy0ttJ6ND00GKJHu3WCzZPos9pqMJGkd5ZiSSzUEWsaWuaaIyxcmmziE/ma1b/B7iUnPStjz8610h1M9DE1CHpEIu4dXT+9lUnhjnyts9NDg2UcpQB4QV1IhEpJRctQB6QhXkiEOpEdqaiuDFJRkQqbayU9jeI/vFIJ5UiE7YUFLoRgVk/QJYJtQcXtKY4z0WfhoTX3qe6p5e5e1TyjlKEhSOOXu3uVRKMIw/TQoGNlYNMdC+hWdDWg1yDqEYm4dyS6AtDKLk02dQw2MUeIcagr+ZMJNadYlwBQZSAR3HDGkAhm0OpLpMWYC6W1Z6qQchwq+aPP2ioEJ/VURyKUCSkFTJlImt1AGzf6yo6zcWnEcBE5TaRA2aKnJEiBQt7Na+2W4KTNDFZ2WbK1VxvniaTy1UQikEe+qX4CoMoERiIY4WjCiQgSifKpqLpBT5uPh6VoXCtkVKTXE42zzTNhcL7F+Xg4HI2GmTC5OjWhZlMM0NKIfHo2sy5r6XpGNS9dv1lVRiklG1+KH3P9C1ch01O2cl4VCbYKBt/EDg32Qqm4H817GcFe7cJKXZEVV6ddynU/qn7o1mLmdG30naJVJDz2H//XSV0fFJub3/of+0IdsVDfZElRBCV03zrBhLK1jquBk0ndmNYJw2lpljvpkVkeHkeCw1xGLHf3xlqHiHgPtctMmuNziktR4XdBncTeIe7R+XFQnLFlJepRN9fakUwwx4ZNj0x6x6f3Tnb3EZKIOnJEUQRtp3gplAEogYBIBCYcrXwUJmrlyag1JRG0VFE9il8zX8oganE+HhZ6eN5filozPvE+07RdQnZwWYmqiHty/aN4eInU+XiYUlVEhVRPrSs3HShu8A3E8wwmEqFpaJkKvRJXcC4Yrl1Y2YLKFZaLclMzwbzsIO2Zu/Rcq64PVv/v//xXr12elnUv5UwikPejQgdJ1qZ+NnF7VLp1HksRYBEeYPaL8G5+Iqn3SxkoJR7Q2jcocsnU/qVkh9AMItHGTVLF+XFQWiHHynoEeOlp1iPT3gk29U4mhgaVDIm+WNPQHG+ncOGFozAPAN4TDIlAJWoeSZho3KsywQbdS3G6gYpui3wXHYQQmWF3SyxsV2y/3VAIuy+uyrIv5l2kFYJZTysbKM4MM6FlJRGY67j+1XC6c60dsda+JCEdrGUB8dmscpXl7t7YX+99kwwh/PR/7BM5JBKTe1nmTlFzGJQsMO5ozQWN7vINqWGWxypc7+QOVY98cMy1EnuBkAhkv9jK9UR7iUBilUEYELIeKwORAxZEpyx6JOwdjWaGoqiU0MuEmRjVDXA8OABUhWBIBMqBEnECPlG7V00J77FFbpV28ZYPRAhbtJoZEblw2lICS4lAZRZKBGFVxmSAESQws1aVBnrlXIVsWfPKbQdKUJXZglDTiQb2Om5cNLWZ2qXJpo5kQp5r7RjsXuJmly0lgnnl6r1d09By8UetpET4q/b/z2TCQkdwL8vMYiT6jKkQ1QGUKxGMoShNItjPMtDTN/wmTtnYTh/Qss9yokFUyt5CJ2PFFreQCG7YSYaRlKOUmc6wiJ9BIoCgEAyJUGoUgXFTlhLBjShC2RLBcuWgMPhhH0UQQUX7xTlT0XA8pSoEB3vBsnLbgWKqsrLffNGW+Y2+4qi6hwb1+7OmoUnD6VYSRdD8Afmjz8Xm5uL+/2US1iYRTWQwDS1NNnUMdk9MNlEL3b2MIuiT98om22dG2KcZ+Q7Sf9pyCluJ0DrB70TLYIapm+RVjstRBPseCXsnNnK5u3ewe8iIJUAigBoiGBKhjLUIskg2iL1U5WsRzCSC2To+zlRrl8w0Kwj7i6oiM1DWmtyvG1VbVCiaOhEMhd1A2WoaA4uHHs2WCxBujwx0G/7GgUQwq1xzkMUf/YiUCNsLV4w61fX8JS1X5J6v032Yc4kgkAWlRxFspuHJBQ3CDBqU2fqjjOycArGqgDCYfehRLN3YUpoBosC+k7FyPgjiHvFRKM5OEna9qtFr+ycasBYBBAVfJIIoaG6kO36iQZ/gtpEIRD3RqM2aAL5FU2+nZrWMsZs8YsDmJFtNkZ2RqPWDXFX8QwdsKZJUVDyPYNLTsp5oKDOKwNyVGpg8dCCauCVuK51IBNPKE32x//xSN6kPPvvpYVkmdUlpTzQwN+5skLyUKIKTJxoqkQj8u5W46QwNNhrBvQaAegsT6dH5dwqJ1gFQpURBEf1PeHdujJUoUCEIpfB95HvEKxXzJojdQexxs6koZrfiiQYQFBrtBcxlvSUJNBjkLzYVm5u3Fxb8tgg4x8kjnQF/8UDAzQMNRANIBGHMHAATyB99LjY3Fw8f9tsiUBLO3/oQ2JccE6tZAfCVBpAI1OQGQgjABoQQahyHb6Jkf6MhQEwkAyxfQGPREBIBAIdsnjqFEAIAAChAIgCgwvzoM0IIAIAGBxIBABXyR58RQgAAAEgEAGQZIQQAAOCARABAlvkQQkeH3xYBAIDPQCIAIG8vLFD6oLl56+pVv40CAACfgUQAQC4ePkxJhL17/bYIAAD8BxIBNDoIIQAAgBBIBNDoFDs6EEIAAAAeSATQ0LA/+owQAgAAaEAigIaG+dFnhBAAAEAHEgE0LgghAACABZAIoHFBCAEAACyARAANCvujzwghAAAADSQCaFCYH31GCAEAABggEUAjIgghnD/vt1EAABAsIBFAI8KEEDaee85viwAAIHBAIoCGg/3FJoQQAABABCQCaCz4H31GCAEAAIRAIoDGAiEEAABwCCQCaCAQQgAAAOdAIoAGgv3RZ4QQAADAHEgE0CjwP/qMEAIAAFgAiQAaBYQQAACgJCARQEOAEJGFRZ4AACAASURBVAIAAJRK1SXCwnhT21DCOsUL5uPhcHxe3O5X3YeOtbr+en6+RTVVkiRJkqIp67JUBttS5VXbQLC/2IQQAgAgAPz+WCzUEQt1xP46Nuu3LQIaRSKI/bWKJxJB2GIqqjpx/YOQVJRy9ralnFWbitpqiDqF/9Hnjaef3l5d9dsuAECjo0sE9e+1kT/5bRJJg0gES4XgiUQwUwhaosUNfSoqhcPEVttS9tUqQYZwNNqYUQQ+hLD59tt+GwUAAJxE6IiFOs79KjAyIWASYWG8qe1YqO1YqC3WvaAkfdV96FjreS39+G0jz/HbWhW3W9VSZlIjFeX9tXCi4epQqO1Y0/EhwkhlqxMz7Fqk/Dfh19lM0RSZ07aUg2rnU6l5NmejgBACACD4/Cl2jhQKf/uh3wbJsuyTRFDcOfmn+OPbrW2kqzb8d+jQ+LSWQf28MN6kygjDwU+fj2k5aVJRgWfkJcLVoRBXp7ww3nRofNreDActOvHlSvDBbYkgytkobOzahRACACCYaFGEod/LskwJhUDEEoIURaA23W7lvbXws7gUhdBfsxLhPOXsp8/HlPDA9PlY0/mv7M1w0qK9L9diD5AILsH/6DNCCACA4EBNNBz7TJZl+U8jfx2YdQlBkghXh4gYgO56nUgEMiDBSwSxv2YkQujQeEKTBepWNXjgTKk4adHOlxvFIBFcgvnRZ4QQAACBgl2LoKiED4cC8phDkCSCC1EEESb+WrQWgQpCJI7Huq8qQsGBGU5atFlXqDxxQKE9plDpckWVBpMICCEAAGoDTRPoskCbcVAnIPwiSBLBfC2CpW+m1w1wcmE+HhZ7RbPlinokQ1m6eP4r86ZloUQwbdHxQ4+ML3fpocfGkgj8LzYhhAAACDCzv3qNXJfw2d8GYN1ioCSC+RMNNr5Zf6KBn2Uwf9xR/Oqkr7oP6Q8p3G5ln2uw/mzXoiwToQJKAbAFWF9uW6q8ausZ/kefEUIAAAQOZeWBuuxAlQVUIEGZevAJvIAZ1CEIIQAAagL9EQYlWqB+VRQDpR78ARIB1CF8CKHY3IwQAgAgaDASQXucgZxr8HM5AiQCqDe2Fxb4EELx8GG/7QIAAA42VEDKAkgEANyG/9HnYnPz9gL/fisAAABWQCKAuoL/0WeEEAAAoDyqLRHuAOAlX3d08BLh7uXLftsFAAAuUGWX7YNEqHKLoHHgf7EJIQQAQN3QKBJhGwAP4H/0udjcvHX/vt92AQCACzSERPB7kEF9splOC0MIftsFAADu0BASYQsADxCGEDbn5/22CwAA3AESAYByKF66xOuDjV/+0m+7AADANRpCImwC4Db8jz4Xm5uL9+75bRcAALhGQ0iEIgCusvH++4IQwquvetSc31cJUBt4dPgBF/H7GCkZSAQASkYYQti4csVvuwAAwE0gEQAojY0TJwT6YM8eD1sEwAHeHYHALfw+RkqmISSC34MM6ofCo0eCX2xqbi6MjfltGgBlkIxINJGkZ23Nxva70kBp9SQjkrQ/NssWN5LUIdAT2O3OSUbKLBhcGkIiFABwi2PHhCEET9v0+yoBaoOyDq7Ro5IkRVPq5XI+HpYkKTLi8hGsMtsfliTp6GhV65npD0vhgTlidDZGj0qSJB1NKl9HIpIUjUaNhKSyebT0AR09KklSuH/WPIffx0jJQCIA4JT8n/8sDCHkUym/TQOgPEaPkt52YzMVlSQpHJvxoi1fJELyKOfui5ejkiSF+2cKBU1CXB4IkwmSFL1cLN0we4lQc0AiAOCY7u7qhxAKhUIeAAeUdXDREkFzn9oN9UxsvzEDMWKkqHGGGTUkrwiKkYj6Rf0Qi1AlOdfOV84l63WT6ZEYUQ+Re79I2IxEBO7+7kBY76QiIYqjRzVllDwqSVJ44K5RXlS/MN2QCMpmPhzj9zFSMg0hEfweZFAXzM4KXoTQ3JxPpfy2DICyUSUCkxDuv5PPj/RK+iSEMgPRO5IvzA0ocxH5fD4/clSSJEkKx+7k8/mRiCRJ4YG5glKFFO6fk2VZiUqcvpPP5/MzqmvP500q19LViY9UVJKk/UrZkV5JksLxeVmW5/rDklrPndP7lezaDAnbvTv9YSk8cJdJVTqhdFKREPni5agkHR1RSijdoBo1M4ZKV8du5s7psCSF4/NbRZf3VvVpCImQA6Bi8r/4hWCV4ssv+20XAJWQPCpJ0tEkkxDun8l9GpEkKRyf28jlcrlCUXWFt5Vb8HDsdi73qTaLHxnJ5W7HwsrNt1bFwN1CLpebVRVFLpfLqRIhmcuZVZ7LbWzJsrw1e5oMMOj5lSr1IIBWoxT5tFDclmV5a4Pp3e1YWCtFodzvR0bUDLOqoeHY7dxIRIlQMI3mNubiZL9F6WrHI5H9khRNbRe5ZmsQSAQAHDAzIwwh5C5f9tsyACpBLBGOjhZux8K6r9TTw/0zOV0j3I6FpejlrctR7YvmNvWsOUoWEJ9NK8992qsEJgbm1Rt0QX6jnkLxXjxsTEv0fsr0biRCtkIwq/bByFAYPSpJkZHbsbAkRS9v5LRGGVRZIUpXu6ElsLbUJg0hEdYBqIx8OCwMIfhtFwAVMnJUkqSjI/r34YjirNfVqHksQ2YM999ZX8/fHQhLUuT06bAU7p9Zn+kPS+HTpyOSFB64m6ezrq/fUdz5CP3ZtPLhiDJxsF3M66kzbH6yznxxW5ZlTU5EhqnODUckKTpaEHRb60NM6cP6+rrSj9jpiKSlqI0q8wkamwXTdNVgKZpSgiKnMoKGaw1IBADsGB0VhxDOnKlO+1kAHFDWwUVLhMwpZW6/mF9fL4xGJUmSeofZDap/VdcDGN80heBAIphWrjjZyLCeKkkRI3/4dGZ9fX1YCTQcHVlfH+6RJEnqGVYcvO7ttd4QAoBFXTBBWE33ap1pVDWnZ9giXdc0hU0zkeD3MVIyDSER/B5kUNsU9uwRhBCefdZvuwConBEiNi4p98DyZiGbzWazhU11FSC7IZtTvWl0tJDNZnPq8sSBuzmiznD/7Ww2m72tygL2s0nlqnNVXXVcmebPZLPZwqaePdIf1+ohUiUpHL9XzBFdy5wOE0axqCJFOjqqZVD7ofZKNZIwxxgBs3Sj44U5ZQnmsAu7yFcgEQCwJJk0CyH4bRkAlVPYZK6YmgzIZrPZbE4N47Mb1HRDS8iyvK3758Km8VXJqWQkP5tWThi0WSxuG/Xq2ZVkqk6ZNsCon03je050i0+hx4fcIEwnOs70tWZpCInwRMAnSoDqE/Xr9Ml28isAKvmXXxaGEHw1Sjl6ySOWT7GFPOap41/5IklS+8lPSjwvfD+P9HHA2Q2ACzSERFgToIbX9p+cWltbW1vLKAtmR0RZvWB2dvZb3/rW7OxstRoE5ZAdGBCGELIDA77apQeHw6eV43fqdFgKh0s7hsljnvz8cY+krsXa2rhT4nlhdR55f8xPnWyXtGfqU1FJktqV09u1sxunLWg0Gl0iSFLPx2trVZYIyoVGAZebIFN47jlhCMFvu5Qpz2g0LEWG19bW1taGI1L46NHy3Xl2Y0uW5c28UXksw6aXWidFVY55ZTX8aH5tbW0tvynL8tZGdm2t9F6IwWkLGpCGkAiPBXwakSQpGo+Hpd6PHz9+rFzaIp8qG2+daDfCle0nbhGJ3Sf0bd0ff9wt6Z/1mo1EvSjDt2hEWYD/WIQQ/DZNeXVLf/9RKXz61uPHj2+dDktH+/vJY5g6iInDU0/uPkUc8+rB/TFVqv3ELT1dweTYFtdJUZVj/tOIJEnKCU1B9II6tclu4LQFQEBjS4TISOFyVNp/4hYlET7ulug3gCqXDCWLFBnZ0l4YKu3vn5e1L8pl9ONuSaJezGlyuQEBZ/X+fbMQgt+mPdYkQmykPyxFhh8/fjwckcL9I+wxTL3dljs+7yrvtlfy68d/trClvDE3Pi9vFbLceSE4ts3qrD65or7MnDrviF5kC1uycWaH43OFrEXXAGh0GkIirAoYjkiSFBleXb8bD0s9l6aVi8jw6urq6npRluVihrjdiHyyurqqZImOrq+urj5RgrEDM0/0DZHh1dXVSz1GslK1tP/kTbZt5nZEZB7wmexbbwlDCE/6+/02bVU9esOxzMhRKXzq5urNU2Hp6EiGPQ7jd9dXV1dXnxQuRyVJ2n/iJnV8PpkZMI558vhXK59m0s2ObdM6Kap0zK8XZZl4HK370irbO4WbJ/ZLkhS9XHiyatE1X7oAQJBoeImgXNV6ThIXkUtKyHG/8QbQyPAqc50RX0ZvnhK9mPMTwaDrFxoT84CfrMzPC3/0ufDss36bpqAdfpn+sBT5ZPWTiBQdXWePw6MjT5jsdDp5QNtLBLNj27xOimoe8+tFWYud7D9xU2DVzRPthITCaQuAKQ0hEVYEqBJhZWVlLX9Zu+uIDK+srHzUI0lSNCVv5dfUbOH+zMrKytTpsJZFSz89tUJtUFd60S/mLK4Lmr99+/a3vvWt27dvi2wDPvPkzTeFIYS1WMxv0xS0w2/tzkA4fKqvRwr3Z/jj8NQNNjuVTh7Q5OfSjm3zOlmqe8yv3RkIS5LU+zFv1UfKtMJcfk3NitMWABMgEVZWVpTQovZ9OCJJktTz0crKyo0+5Q2g/HVGfBldWR+NSpK0/+SNlZWVlRt97ZIkvfGR93sRuMn8fOHpp3l9sPH00yvz834bp6AfftqTOUdH1vjjUOr+aGVFO4qjl/Nr1PH5UbdxzDuQCKbHtmmdVeejNyTjhLtxcr8kSdHRdaZ3Si5CIKzgtAXAlIaQCMsCVImgfHms3HEo37Mb3BtA95+6sbx8S73OGMXDp28tL9Mbshvsizk3sqLmQWDJ/uxn4lUIb77pt2k6xuGnLEAIxzLccci83VY5DrMbenJPLG7kJ8uWemyb1Vl1CEMkSYkLKBYSvVAEAMm+vhs4bQEwoWElQnZDlo3rwOP8lmx8z27opTfy+S1Z3so/1vKQWbbyj43Cel1EaVxoao2VmzeF+qDwX//r8r17flunYxx+ysHHH6D6Mc0eh3qycmirm8iypR/b4jp9gOyz3geqF3QOIhdOW1Am+vST34Z4QkNIhK8BcIZZCGHtn//Zb9MAAIEjk8noi1gzmYzf5rgPJAIAKivj42YhhK/n5vy2DgAQOJhHYf02x30aQiJ8BYADci+9ZBZC8Ns0AADwgYaQCI8AsGP50iWzEMKj2Vl/bfP7KgFqA3+P0saEiSLY5vf7GCkZSAQAHj169Gi9rU0oER5Ho36bBgAIKFNTU7o+mJqa8tsc94FEACDQIYRHjx79GQAH+H2cNiiKSnCoD/w+RkqmISSC34MMgk7+2WfNQgh+mwYAAL7REBLhIQDmrJw8KdQHxebmhzh4AAANDCQCaHTMQghr//iPfpsGAAB+0hAS4QEAJiyfOGEaQrh+3W/rAADATyARQANz+7bwF5uUEILfxgEAgM80hERYAkDESiRiEULw2zoAAPAZSATQqGQyZiGExz/9qd/GAQCA/zSERPgSAA6LEMKDzz/32zoAAPCfhpAIiwDQLH32mZk+WP2Hf/DbOgAACAQNIREePHjg9ziDYLH6D/9gJhGWPvvMb+sAACAQNIREWF5e9nucQYBACAEAAJzQEBJha2trAQANixDCl9eu+W2dgMcAOMDv4xTY4/cxUhpra2sNIRFAg7P2wx/Of/CB8nn+gw/M9MHK3/+9v3YCAEDQqLLLrrZEkGU5Cxob9WcbX3opm0wW9uwxkwjZZNJvSwEAIFhU2V9DIoBqY6YJqN99fvllv80EAIDAUWV/DYkAqo0TiYAQAgAA8FTZX0MigGqDEAIAAJRHlf01JAKoNgghAABAeVTZX0MigGpjH0V49tncz36WO3Mme+eO38YCAECAqLK/hkQA1cbJWgTlL3fmjN/GAgBAgKiyv4ZEANXGiTjYePrp9evX/bYUAACCRZX9dR1LhC92tx0LUX+nO32KW18/e1qx4amz902y3O88eCzU9u/cXbNZeg1jqw/yP/jBky+/9NtMAAAIHFX210GUCKffOBb63/+ernQkb/1d27HQofFptdnbrVVQCXdGn/rtF1zqFy2aJdvFnEnJxdd/cSzU9of3nabXMDaTCz/7md8GAgBAQKmyvw6cREi/+zv1pr9SlXDr79qOhX4xNql+Ldw8Hwu1HfthqqJKrbgz+lTbsdC/3LKzRAgkAhYfAACADVX21wGTCB/EqamBNz6tYCRZxzx5LhZqO/Z3Y9lsVnPn7ATEF7vbjoUOnn6qTY/tE7MVB0e1uXEl22jnb9VNu0ez2oyA8kfOC5DpSkPCnLQU0M377WVaIljYQ5odaLD4AAAAyqPK/jpIEiH9799mVw8c+/a7X5Q7koxE+KKl7ViobeiDQlb1qcdvy7KsTkCo7vbW37UdC7XF3liQZXmzoGRTpyoE2V6f19J/MXo9myveH29Sq90sGGbkitu3W9V6tos5xccPJWRZlr/qPqQ7dVIiEO3Oj+1oE6VbmR10sPgAAADKo8r+OjASQaQPlL8XPihvJBXHSf7FuhcUD1rYlGV5c4m4m794Vi9y6MpNZcHA6MVQ27GmDx7kslltniL2qztMtqXXD2nFZ8eabCcalDrPPyxks9lsrnh1KNR2bMfZ+5REINvNPXjjkCjd1J4aAIsPAACgPKrsrwMiET59wUQfhNqOhdp+d7icVQnMckWZWCyohut3fPCVtoxRuU2nAg/X34/xxvwwxWQjXLsDiaDU2XpFc+Zjfwi1HWs6t0jWQ+dh0+3sqQGw+AAAAMqjyv46EBLh9BtnzuqbB8+q/q83pSVNd3aXsXTR3HGOXgy1HWu9qkgGRUmMfcEVyV35Q6jtWNP5r0jjNwvZSiSCUueO97VHH0USgc7DptvZUwNg8QEAAJSH5x6aJhASYWNra0P/ckGTCD2jWlJ+c2szX/JImjvOsT+E2o6Fjn2RNd5YQEw06EUK061tx0K/uHw9m6XfT2AiEXJTrbYTDUqdbYNnlDp/cSzUNnS+mKPqIdsdHQy1idJN7akBsPgAAADKo8r+OhASgUIgEcrD3HEWNhPH9Vj9H7rPx0Jtsa47fJHCpjoNofwNJdTFgCYSIVv44LjwHU1k/sKmukqRqZOqZ3NhvEnJcGys+xCRbm9PDYDFBwAAUB5V9td1LBEKm7Lpu4oKm7o5m8XitpaPL0JkNB4WILPlitvGJi030ypTrVKEqZOqx8iiWMc0bWUPAACAusULp2xBHUsEAAAAoK6osr+GRAAAAABqgyr7a0gEAAAAoDaosr8OnkTY2FLzEU85AAAAAKDK/logEWx/qxd/+MMf/sz+/L6EAlDPBEIieNqk3yMMAPAKSAQAPMVT78wDiQAAcA1IBAA8xVPvzAOJAABwDUgEADzFU+/MA4kAAHANSAQAPMVT78zjg0S4AwCoU4rNzX6bAEA946l35vFBIgAA6hVcPQCoJyARAACugasHAPUEJAIAwDVw9QCgnoBEAAC4Bq4eANQTkAgAANfA1QOAegISAQDgGrh6ANcpFoszMzOff/55sizS6XQmk8nn8373oyaBRAAAuAauHsBdisViOp1eXFx88uRJeTXk8/nFxcWxsTGohDKARAAAuAauHsBdMpnMvXv3Kq9ncXExk8lUXk+jAYkAAHANXD2Au6TT6Uru/m/8eX3w9rIsy8VicWxszD27DGZnZxOJRFdX109+8pO9e/d2dXXFYrGHDx960Vb1gUQAALgGrh7AXZLJZCXFu0bvv3zhtitVCbl06VJLS4skIpFIuN5c9YFEAAC4Bq4ewF0q9Ov/Mz717OmbrlTF09XVRauCszOyLMszZ7XvBw8edLfF6lOvEmG5uzfWOsEkzrV2DHYvmW1V00MdsVBHrGlo2VmdGkuTTR3JBPVVrcq0iEOYmt1BHwpfWq875uNh7aIQTfGpRJowUU8Lx+dtGhBWZVbOsi2r5srHuHqkooJmxANFICzFGs8UVcpEU3T9HnYSVJEK/fp/+uf0d//tT65UxZBIJNhjrWv8a1mW5a/HCeVQ67GEepUIQmwkQqIvFuqdnJYVv8h7UAuJMNfaEQsZrnSuVVcGE8lQEJ2xY4kA7ElFda+Viuo+SU8lNgsTjTLz8bDQc5pWZRQTOEJhKTkVNXHO7qBePUiTjObFA2UgLsVmCDODlIoaafwICusBtUMlfv3rXPEvjoz+t5NfVF4Vw8OHD83mF3hqel0CJAK/1QyxRJgeGgx1xJr6koaDn0iqUsO8lABIhBolFSWcne6jiFTDb4kSKa9G1SVoQFiVrVlEE7bFKkR09dDaFA+UGSJL5+NhKRqPh8kNqagUjQsH07weUDtU4tc/nFn5xpHR1nOZyqti4EIIagBBJqcZNGKxmFvtVp9gSAQjLK/7reXu3sHuoaQSqw/1zWlZlft14pZ9abKpI9k9NEhPEBCOeUKvJCmQCBNJtZS9h17u7o219iWZmYjpiTkt8CAsTkQUSHSrVJP0fg12L8ny0mRTb7K1NxbqSCaMmoVj4nigxEMhNImYIrFpHTBoN61Cx+88kcS+lAhxtfO0e3Uf/uphF+MQIy6ldIrqRCqqpFhEERBECAjM3rGdKJNluTK/3jV6/y+OjP70o7nKq2JrZlchdHV1aTKB0whdXV1utVt9giARmLC87pB09zbXqrpkw7VPDw0SkwKaw6aLt05QlU8PDYYYiUDOAkwkQ72TCU1qmK5UUMMDnOM3kQiGnWyXqXZZkbE02aTXTzlp8Zg4GijxUIhJ9GkiwKZ1QGE4thLUgOEslWsm69GEpVJRKRxPiVYoWJXSgvLeTdJTVw/VBwgaMtENNqW0ThEaQVEAlERgQQwhGBBLRrSvxGFvquMq8ev/Mz71l52jh4bvVV4Vw969e/kJBUUiUCsRJEmSpJaWFrfarT4BkAiUcxXPBUwPDYb65sQ5yXUDtD9TRYDhoenKh+gFB3o4QTZbQECZZDhRQS8Is52HFliJYN4pckycD5R4KAQYazLsWwcG1JWupICB5tgUp+9UIlCrHpzHHvScntxfC64eXLzA2iWYldJKqjEaXfJQMRs+imAlRkCVUA7wcDQatj5BRFTi1//TP6e/caRqEsFMIUAiVIh45p6ewlfyEI8JUDF5etKB9Gf0TTwlEdSYge7nRGZMa0EFU2esw0kE5k6drkomJgL4aIFNp2iDnQ6UyVCwsGEPm9aBynw8zC3dL31OQUs0bobJW2SylGhe376UqC13sVqLoNvqqF3LORdVI2gqx0IiYL1iAJhPpbjQmtMFMmX79Ufrxb84MuqRRHjrrbfECkGwFKG2H30MgEQoM4ogKl5SFGFCpjwlVblwjSEbRaAi7bRt5vEDDn1ypESJ4DiKQDRkKxGMmRq+X4gimCK6LXa8XJGtiHdntoschcXs2vJDIjiKH3ClDJiRTGnBBBuJgChCMGD3jhE9s9g/Zft1Za2iRxIhFouxQkB5J4IgiCC9++67brVbfQIgESzWIrCT6ISX0l2XjTe1XIsgU47T8Pq8p2RMItcKsE2bPTPJZCbWIhgdEekVZjWAaEwcDZTtWgTh9IpN66C0Zw5NHnpkn5N0WJV1MUEpMqc3KxfVq4ewIduYv6159J2n4VzMJQLmGQIEG9ki1u14sBZBWavokUR4+PAhpwQUjSAzgYSWlpYvvvjCrXarTxAkgtkTDYLHB9iV/7KDG26t8qahSVGIYrm7l3w6wOJ9R2YmsWYk+mKCRwMY2CcajNbp5wi4TrEGOB4o8VDowsjou8k8jmX3GxjjZT8apB6gEswS9TRTZyasippYcFjK9t1FFaJfPfiGzAaKvM23MY/0MeQKDKvliphkCAzk7nNpLUJ6cS1X3BJu+v6Zqb/8p8seSQRZ+OokETX9xKMcFIkgwPHrBDwpHkzspz+q3joAFMG4eoBA4qpEWHhceObkzW8cGf1m19iu30+/P/UVoxX+rzevejfRoHDw4EFrfdDV1VX2b1gHhHqVCHX5aiBIhCAiSVJN/+suwbh6gEDCLaBxMtFA/tLjzHLujzMrf5xZ+U36y//z9TElSPCNI6P/xz+NfuPI6F91pXb9fnrgxqM/zqwkMl8rswy6RPDolx7NYgktLS2JRKLW9YFclxJBfXagDtfbQyKAoBOMqwcIJGW9OimTySwuLiqfR+49fn30/uuj9w8N33vu9K0Dl+aUr50j8z88N/3MqRsvfpDpHJlXEv+fizP/74d3Xx+9P3LvsSzLi4uLN2/e9KJbs7OzsVjs4MGDLS0tLS0tBw8efPfdd2dnZ71oq/oEViIAAGoPXD2AuxSLxWQyqauE8mp48OBBOp2ug3v66gOJAABwDVw9gOsUi8VMJjM2NpYsi7GxscnJSX22ApQEJAIAwDVw9QCgnoBEAAC4Bq4eANQTkAgAANfA1QOAegISAQDgGrh6AFBPQCIAAFwDVw8A6glIBACAa+DqAUA9AYkAAHANXD0AqCd8kAh3AKhlFoA5xeZmv00AoJ7x1Dvz+CARsgCAOqXY3Oy3CQDUM556Zx5IBACAa0AiAOApnnpnHkgEAIBrQCIA4CmeemceSAQAgGtAIgDgKZ56Zx5IBACAa0AiAOApnnpnHkgEAIBrQCIA11lbW7tz585nn31W3i89ptPpqamplZUVv/vhDp56Zx5IBACAa0AiAHdZW1tLp9OLi4tPnjwpz+Pk8/nFxcWxsbH6UAnuumNbIBEAAK4BiQDcZWpq6t69e5X7ncXFxampKb974wKVD0VJQCIAAFwDEgG4SzqdzufzlfudYrE4Njbmd29coPKhKAlIBACAa0AiAHdJJpNuuZ5kMumFhTdv3jx79mxnZ+f+/fv37NnT2dnZ19c3NzfnRVtZSAQAQO0CiQDcJeAS4eLFi7t375ZEnD171vXmso0oEWavPdUxfCabzWa/7OyO7R6vcABFlRhNOK0h1BELWRdh67QtVV61lpTWL+AZmVPtIG0wzgAAEgpJREFU2nWhZ5hPJdKEiXpa+6mMTQPCqszKWbZl1Vz5sBIhc6rdpHWyJyLDRdvV4sym4R49keydd50EVSTIEqGzs5NRBTOyLMszZ7XvBw4ccLfFbCNKBAPPJEIpnHkvFnovQ34wzUa4Z9tSzqrN7LbVECBwDPfoXmu4R/dJeiqxWZholDHzjKZVGcUEjlBYKjvcY+mcK4WWCITzpiyiBopnuMdEQmROtUvt7cwgDfcYafwIUp0HtUdgJcLZs2clhq7xr2VZlr8e7/IwluDWaDgEEoEhs7vjQudsNpu1vEcfHw51XyC22payr/b6hQuhjthT7w0jMFBjDPcQzk73UUSq4bdEiZRXo+oSNCCsytYsognbYhWiSwTlfr69p6edFDWCgRIazsoAstCpU+1kF4Z7pJ5TwsEUtApqjmBKhLm5ObP5BR531yW4NRoOCYBEEE40jA9z/lLZ+mVnd2z3hWtPdcRCHbHQe5nsLPFZz/becKgjFuqIPXXhS6qJ2WtPdQx3XrhAbRUbk6X8OsWXnd3DZ8ictqUcVHt9PHOdzUkwrvZI/9s9zgzdhc4LWh7z4AfwGO2mVej4nSeS2JcSIa42Q7tX9zEkwvCwVWDE9O4+c6q9Z9hqoqFnmOrEcI9E5BdGERBECCZKjMluMiiYEoELIagBBJmcZtDo6+tzq90sJMLuccUdKk6UEA2z157qvnZdmdHvvnY9m1XD8srn2WtPEUXIDJQrnb32lK4MxocFIX0nvvzChacufJl1WyKIcooxpiroodO6k9ktVD/Ae4yQfwlqwHCWyp0369GEpYZ7pPZTw6IVClaltDt07ybpbdYikMmi9lXvby0RSKGjKABKIrAghhBEyCPAcjIomBKBW4XQ1dWlyQROI3R2drrVbhYSYfcF3dlns0r4/b1MVnfM1DyC8DM10aB6U0oiWAb87X15ZrchSnyQCGfe0wWQ6UpPfdBANcmcajeudCUFDDTHpjh9pxKBWvXgPPag5/Tk/tqJRKAGimK4x3pRhpauawS1DxZRBDMxAgKE1WRQMCXCnj17+AkFRSJQKxEkSZKk3bt3u9VuFhIh1H3tDOnhjOABF1dwIBFUZ0lPNDB+/bo270DlzGaFvvzMe0RUo+oS4fqFC4Y+4IbOWIExPkxlA96TOdVO+eny5hS0RONmmLxFJkuJ5vXtS4nachdbicAOFG2QmtVOImgaQSthIRGwXjHwWKu42pEIZgoBEqFE2B4L/BzlRM+8d6FzXBEK2TKiCNSkgKlf17FeV6g8ccCtCXBjuSI3Ghz8zAiiCMFAdFvseLkiWxHvzmwXOQqL2bXlh0Qwjx9kyalpHfOAijbRwkQdsFyxtlBVbe2tRTh69KhYIQiWIrj86KNbo+GQYEoE+j5YWbqoTq47kgjEAgV+LYK1RHD60CNT3KWHHq2XK1oEJ0QrMEB1KOWZQ5OHHtnnJB1WZV1MUIrM6c3KRSuJ4DzmbxtF0ASFWp25RMA8Qw1Qg2sR+vr6WCGgvBNBEESQjh8/7la7WUgE0uVrrjSzm32uweKz/RMN1hKBCBVQCoBdAMgWty1VTrVaBv21S/rfhc5ZbuiYXoOqwN/8knqAuxkWJepp1m8KYKuiJhYclnL47qKysZAIZgMluM13IBGoFRhWyxUxyRB8vF2LsLWtfnD3oUdOCSgaQWYCCbt377569apb7WYbUSIAF3DllRIAVApewAxKp1KJkCtuXb7/OFfcYtIXHheeOXnz55+oPxTp+auTRLj7xGMWEgGUBSSCb0iSVNP/ugskAnCE4zkv8pceZ5Zzf5xZIf8Gbjza9fvpb3alvnFk9JtdY7t+Pz1w45Gy6TfpL//DG2N/2Xn5h+cysje/9HjgwAFrfdDZ2fnnP//Z3UY99c48kAj1ASQCCASQCMAhDue8pqamFhcXFd8xcu/x66P3yb/OkfnWc5lnTt347/Fbz5y68eIHmc6ReWXToeF7z52+deDS3Mi9x7IsLy4u3rhxw/VemMUSdu/effbsWdf1QRYSAQBQu0AiAHdZW1tLJpO6SiiDYrH44MGDdDr99ddfe2HhzZs3+/r6Dhw4sHv37t27dx84cOD48eM3b970oq0sJAIAoHaBRACus7a2NjU1NTY2liyLsbGxycnJlZUVv/vhDp56Zx5IBACAa0AiAOApnnpnHkgEAIBrQCIA4CmeemceSAQAgGtAIgDgKZ56Zx5IBACAa0AiAOApnnpnHkgEAIBrQCIA4CmeemceSAQAgGtAIgDgKZ56Zx5IBACAa0AiAOApnnpnHkgEAIBrQCIA4CmeemceHyTCHQBqmQVgTrG52W8TAKhnPPXOPD5IBABAvYKrBwD1BCQCAMA1cPUAoJ6ARAAAuAauHgDUE5AIAADXwNUDgHoCEgEA4Bq4egBQT0AiAABcA1cP4DrFYnFmZubzzz8v78eg0+l0JpPJ5/N+96MmgUQAALgGrh7AXYrFYjqdXlxcfPLkSXk15PP5xcXFsbExqIQygEQAALgGrh7AXTKZzL179yqvZ3FxMZPJVF5PowGJAABwDVw9gLuk02lX7v6LxeLY2Fjl9fDMzs4mEomurq6f/OQne/fu7erqisViDx8+9KKt6gOJAABwDVw9gLskk8kAVqVz6dKllpYWSUQikXC9ueoDiQAAcA1cPYC7BFkidHV10arg7Iwsy/LMWe37wYMH3W2x+gRAIixNNnUkE7Isy8vdvbHWCXdrX+7ujYU6YiG1CVsbHJYqr1pLSsoMAsV8PKxdFKIpPpVIEybqaeH4vE0DwqrMylm2ZdVc+bBXj/l4uHKb2Y3MplRUTyR7510nQRUJrERIJBLssdY1/rUsy/LX44RyqPVYQgAkgoH7EiHRFwv1zZEfTLMR7tm2lLNq51ptNQSoB1JR3WulorpP0lOJzcJEowzrT7kG2KqMYgJHKCwlp6LCJtyCvnoQzrsSm3Xm42EpHGYGKRU10vgRFFcEaoZgSoSHDx+azS/w1PS6hPqWCHOtHYPdS7IsW96jTyRDvYPEVttS9tVODw2GOmJNfUkEBuqfVJRwdrqPIlINvyVKpLwaVZegAWFVtmYRTdgWqxD96qHcz4ejUbve2dtsMB8PS9F4PEzWkopK0bhwMB02CgJNMCUCF0JQAwgyOc2gEYvF3Gq3+gRAIggnGiaSnItVti5398ZahyabOmKhjliob05eIj6b1ixTfp1iubs3mSBz2pZyUO30xNw0m5NgIhlSbNb+WieYcRjsHtLymAc/QPDQblqFjt95Iol9KRHiaudp9+o+hkRIpdjASJk2cxmoTqSiSopFFAFBhGCixJjsJoOCKRG4VQhdXV2aTOA0QldXl1vtVp9ASoSJZEj1u4RoWJps6p2cVhYB9E5Oy7IayVc+L002lefLhwabhpZltyWCKKcYY6qCHgdthmKutSPWNLRsWQcICkb4vAQ1YITClTtv1qMJS6WiUjiespi3N20rHLZb+FAJVmsRyrSZz0BoBEUBUBKBBTGEIELONFlOBgVTIuzdu5efUFAkArUSQZIkSWppaXGr3eoTPIkwRDn76aFBxYOqvpyajDD7zNcsm/jyuVZDYfggERJ9utwxXbapjwAIOPPxsCS+Y7YLGGiOTXGgTiUCterBeexBz+nJ/bWNRCjDZlEGXSOofbCIIpgsegBBwmoyqHYkgplCgESoEObuuXcyQTpFI3jAxRVEn5VFAMQchJUvT/QRIYqqS4TpoUFDH3DjYMidiSSVDQSS+XiY8nnlzSloicbNMHmLTJYSLYCwLyVqy11sowjcog2TzNZzLqpG0FSOhUTAesXAY63igikR3nrrLbFCECxFqO1HHwMnEVonZMbvJvoGuycUoSCXFkWwWVeoPHHArQlwY7ki1zWOiST7sAOiCDULFT9Qcbxcka2Id2e2ixyFxezaqr5EqNxmZiRTWjDBRiIgihBUVFVbe2sRYrEYKwSUdyIIggjSu+++61a71SeYEoG+dVaWLqrz8SVJBKcPPTK+3KWHHq2XK1oEJ9j1Fm6/KwK4SinP75k89Mg+J+mwKutiglJkTm9WLlq/F6Ecm01qU9a6qbWZSwTMM9QANbgW4eHDh5wSUDSCzAQSWlpavvjiC7farT5BlQiKm1S971wr+1yD9WcSPVRAKQB2ASDry21LlVOtlkF/7ZL+N9i9xI1Dn/pEA9YqBhxjXbYGNfdOJpgl6mmmzkxYFTWx4LCU+CVP7uH81UkmMwrCnopqI1czWC1XxCRD8PF2LcLWtmtVkQhenSSipp94lAMhEQCLF2+ZBKAa4OoBSqdSiZArbl2+/zhX3GLSFx4Xnjl58+ef3HNeVUkcPHjQWh90dXWV/RvWAQESIYBAItQSkiTV9L/ugqsHcITjOS/ylx5nlnN/nFkh/wZuPNr1++lvdqW+cWT0m11ju34/PXDjkbLpN+kv/8MbY3/ZefmH5zKyZ7/0aBZLaGlpSSQSta4PZEiEQAKJAGoVXD2AQxzOeWUymcXFReXzyL3Hr4/eJ/86R+Zbz2WeOXXjv8dvPXPqxosfZDpH5pVNh4bvPXf61oFLcyP3HsuyvLi4ePPmTS86Mjs7G4vFDh482NLS0tLScvDgwXfffXd2dtaLtqoPJAIAwDVw9QDuUiwWk8mkrhLKq+HBgwfpdLoO7umrDyQCAMA1cPUArlMsFjOZzNjYWLIsxsbGJicn9dkKUBKQCAAA18DVA4B6AhIBAOAauHoAUE9AIgAAXANXDwDqCUgEAIBr4OoBQD0BiQAAcA1cPQCoJyARAACugasHAPUEJAIAwDVw9QCgnvBBItwBoJZZAOYUm5v9NgGAesZT78yDKAIAwDVw9QCgnoBEAAC4Bq4eANQTkAgAANfA1QOAegISAQDgGrh6AFBPiCUC/vCHP/yV91f9qxgAwCMEEgEAAAAAABIBAAAAAAIgEQAAAAAgABIBAAAAAAL8lwipqCQgmqqgyvl4uJwqlGLmzaeikiSF4/MVWAZAw2CcT8ZJY6QJTjHiBDTLpF8t9C1MCn85wRkbFMh9w+5ZZVtFl33gCf5LBI35eNjZ6TwfD9scSWVJBOMYNZMCdLq9GQA0LMbpTJw28/GwcorZnuxmp7DuZbTC8/GwFA4bmVNRqhw8T1Ag9yh3hdXEIXZU8Kg1ieDI+5cZRbArzl7rcEADIEZ4NhOJ1me7+emlnIPRaFjbmooqX00kAkJ/gYTZK3xsCASGIEsEMu6oHDtcChWaJG/wRUXU7bZahL3KUOnh+LzAMCKExloRJ0KrRjatet48AGof4TlEJpqdZPo28emgbopHCamhnmLmUQScWQGDloDcPgRBIrASgYwQEkcUdXBxlxxSBBgBTSma4qowvWpYXLrMoghk01weSsqwhUXmAVDzKOeYcncvOo2dyADhCapuS8XVMEIqqn7DWoTagZ79SUWlcHweV8CgElSJIIpEGTfw1JFkFmwwfHBZyxL4K4uJROCWKKjfTK+IlZoHQMAhD2zxuWuuAyxv/LWNil9RbkBT3NlonFA4wwIHJxDMLuwgEARUIrAHjMVlhlwUJbhdoaYinB6B4quUWCLwy7DZEAFbY8XmARBwhHMKjiYarKcGtK2KNpBTUTYGx9WLqYYgoewq+oaKDw+DABFQieAoikBdDcx8sEzW4PQQFF+/HEURmA7ZSYSyzAMg4BjXflYi2CxXtHEV5IVAX5IAiVAjsFc50e0VroEBI6gSwTQqQFwCiCz0QzNGfiMLMwHAXTNIeWtyh8OtObB2/w4kgsg8AOoAQyPYPfRIiwIbj25sVkOIbLwOTzQEFmWPmewLRBGCSmAlgkxrTPZJZyUrsTZJWRLL3+OX8ESD6LEEbru2hTRD/FKQUicacB0DdQX3DgMqUT+jy5QIhKbnJALuS4MHHzEQXOyxq4JHcCQCAAAAAAIEJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABEAiAAAAAEAAJAIAAAAABPz/lsSNfw/4jSMAAAAASUVORK5CYII=" alt="" />

      百度网盘下载:http://pan.baidu.com/s/15IEqq

  1. 解压ikvm-0.40.0.1.zip,并将%IKVM_HOME%\bin添加到path中。此处的%IKVM_HOME%是指解压后ikvm的主目录。
  2. Debian IKVM下载IKVM.OpenJDK.ClassLibrary.dll。

    百度网盘下载:http://pan.baidu.com/s/1c07a44g,解压即可。

  3. 新建一个Java文件, 如
package myPackage;

public class Hello {
public String sayHello(){
String str = "Hello, this String is from java program.";
return str;
}
}

4. 编译Hello.java文件,然后将myPackage打包成一个jar文件,例如jar cvf myJava.jar myPackage,也可以直接使用eclipse等IDE直接打包成jar包比较方便。

5. 使用ikvmc -out:myJava.dll myJava.jar。你现在应该在看到一个myJava.dll文件。亦可以在转换时指定结果程序集 如: ikvmc -target:library myJava.jar - keyfile:key.snk

6. 新建一个C#.NET项目,首先添加一下必须的DLLs

1) %IKVM_HOME%\bin\IKVM.OpenJDK.Core.dll;

2) %IKVM_HOME%\bin\IKVM.Runtime.dll ;

3) %IKVM_HOME% \bin\IKVM.Runtime.JNI.dll ;

    4) IKVM.OpenJDK.ClassLibrary.dll;(该DLL在解压后的IKVM.OpenJDK.ClassLibrary\X86\0.38.0.0文件夹中。)

添加第8步生成的myJava.dll到C#.NET项目中,然后using %package_name%就可以实现对Java的调用。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using myPackage; namespace testIkvm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } private void button1_Click(object sender, EventArgs e)
{
Hello h1 = new Hello();
String s1 = h1.sayHello();
txbx.Text = s1;
}
}
}

相关文章