在C#窗体程序有一个按钮,我希望点击这个按钮可以调用一个java写的项目(名称为javaProject,它是一个web项目,我单独调用了后台代码),这个java项目返回一个字符串,我要在C#中得到这个返回值。
由于java项目里面包含大量的jar(多数是spring,hibernate的jar),所以使用ikvm将java类库转为.net类库难以实现。
我现在是将java项目打包成jar,写一个java类(diao_java.class)调用这个java项目的接口函数(在diao_java.class中引用了java工程打包成的jar,javaProject.jar),然后用c调用这个java函数(diao_java.class),做出c写的dll,c#调用这个C写的dll,可是目前这个接口函数返回值是null(不知道是不是由于有大量xml配置文件,找不到相应的类?)
不知道各位知道为什么接口函数的返回值是空的嘛?大家还有没有其他的解决方法呢?
不过不可以使用webservice。谢谢各位了~~~

解决方案 »

  1.   

    在C#中调用 java的函数:
    一、简要步骤:
    首先,编写 java代码,并用java编译工具编译生成jar或class;
    然后,使用 ikvmc 将jar或class文件编译成DLL文件;
    最后,建立C#工程,调用DLL。
    二、准备工作:
    1、  到IKVM官方网站(http://www.ikvm.net/)下载IKVM需要的组件:
    (实际下载的网址是:http://sourceforge.net/projects/ikvm/files/)
    File/Folder NameSizeDateDownloadsopenjdk6-b12-stripped.zip30.8 MiBFri Jun 05 2009 16:201,338ikvmbin-0.40.0.1.zip11.8 MiBFri Jun 05 2009 13:292,966ikvm-0.40.0.1.zip15.3 MiBFri Jun 05 2009 13:272,246 
    2、  到mono官方网站(http://www.go-mono.com/mono-downloads/download.html)下载:
    mono-2.4.2.3-gtksharp-2.12.9-win32-3.exe。该文件较大,有70多M。下载该文件的主要目的是提取其中的IKVM.OpenJDK.ClassLibrary.dll,该文件有30M。(当然也可以在Google上搜索下载。)
    3、解压ikvm-0.40.0.1.zip,然后将其中的bin目录的全路径添加到Path环境变量中;
    4、安装mono-2.4.2.3-gtksharp-2.12.9-win32-3.exe,然后在其路径下找到IKVM.OpenJDK.ClassLibrary.dll,默认是:C:/Program Files/Mono-2.4.2.3/lib/mono/ikvm;
    5、将在第3、4步中找到的以下四个DLL拷出存放,目的是便于C#工程引用:
    IKVM.OpenJDK.ClassLibrary.dll
    IKVM.OpenJDK.Core.dll
    IKVM.Runtime.dll
    IKVM.Runtime.JNI.dll
    准备工作完毕。
    三、测试实例:(很简单的代码)
    1、  建立一文本文件:demo.java,输入代码如下:
    package test;
    public class demo
    {
        public String Message = "Hello from Java!";//java 属性
        public String Function() //java 方法
        {
          String str1="Test ";
          String str2="OK!";
          return str1+str2;
        }
    }
    2、进入CMD,cd到demo.java所在路径:
    先执行:javac   demo.java
    再执行:ikvmc  demo.class
    至此,应该已经生成 demo.dll 文件了。
    2、  新建C#的Form程序,在“解决方案”--“引用”中添加demo.dll和上面所提到的四个IKVM的dll;
    3、  在按钮的响应事件中添加如下代码:
            private void button1_Click(object sender, EventArgs e)
            {
                test.demo td = new test.demo();
                MessageBox.Show(td.Message);
                MessageBox.Show(td.Function());//调用java的方法
            }
     4、编译,运行,OK。
      

  2.   

    楼上内容来自:http://blog.csdn.net/mywait_00/article/details/4580844
      

  3.   

    问题是,我的项目很大,有很多的第三方jar,使用ikvm很有难度
      

  4.   

    参考:
    http://stackoverflow.com/questions/129989/how-to-call-java-code-from-c