java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊

java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊

总体分三步走:

一、准备一个 C# 类库 (dll)

二、编写一个java 类

三、编译 java 类并打包成jar,即可执行

第一步,我的 C#类库代码
Calc.cs 代码如下:

using System;
namespace MyCSharpDemoCalc
{
   public interface ICalc
   {
       int MySuperSmartFunctionIDontHaveInJava(int mi);
       string PrintPatientInfo(patient aPatient);
   }

public class DemoCalc : ICalc
   {
       private readonly Random r = new Random();
       private patient Patient;
       public DemoCalc(patient aPatient)
       {
           Patient = new patient();
           Patient.ID = aPatient.ID;
           Patient.FirstName = aPatient.FirstName;
           Patient.Sex = aPatient.Sex;
       }

public int  MySuperSmartFunctionIDontHaveInJava(int mi)
       {
           return mi + r.Next();
       }
       public string PrintPatientInfo(patient aPatient)
       {
          return aPatient.ID.ToString() + " - " + aPatient.FirstName + " - " + aPatient.Sex.ToString();
       }
   }
}
patient.cs 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyCSharpDemoCalc
{
   public class patient
   {
       private int id;
       private string firstname;
       private bool sex;
       public int ID
       {
           get { return id; }
           set { id = value; }
       }
       public string FirstName
       {
           get { return firstname; }
           set { firstname = value; }
       }
       public bool Sex
       {
           get { return sex; }
           set { sex = value; }
       }
   }
}

编译成一个 C# 的 dll比如 MyCSharpDemoCalc.dll 即可,FrameWork用什么版本都可以

第二步、编写一个java 类,代码如下:

MyCalcUsageInJava.java

import net.sf.jni4net.Bridge;
import java.io.IOException;
import mycsharpdemocalc.DemoCalc;
import mycsharpdemocalc.ICalc;
import mycsharpdemocalc.patient;

public class MyCalcUsageInJava {
   public static void main(String arsg[]) throws IOException {
       Bridge.init();
//加载 C# 类库
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("MyCSharpDemoCalc.j4n.dll"));
//实例化 C# 类库中的类 patient
patient Patient = new patient();

Patient.setID(1);
Patient.setFirstName("张三");
Patient.setSex(true);
//实例化 C# 类库中的类 DemoCalc
       ICalc calc = new DemoCalc(Patient);
//调用 C# 类库中 DemoCalc 类的方法MySuperSmartFunctionIDontHaveInJava
       final int result = calc.MySuperSmartFunctionIDontHaveInJava(123);
       System.out.printf("执行结果 : " + result + "\r\n");
//调用 C# 类库中 DemoCalc 类的方法PrintPatientInfo  
       final String result1 = calc.PrintPatientInfo(Patient);
       System.out.printf("执行结果 : " + result1);

}
}

第三步、编译我的java文件 MyCalcUsageInJava.java 
分几小步
A)下载 jni4net http://sourceforge.net/projects/jni4net/?source=dlp 解压
B)在解压目录下建立sample目录
C)在 sample目录 中 建立 mycalc目录
D)在 sample目录 中 建立 work 子目录 将 jni4net lib目录中的 jni4net.n.w32.v20-0.8.6.0.dll、jni4net.j-0.8.6.0.jar、jni4net.n.w32.v40-0.8.6.0.dll、jni4net.n.w64.v20-0.8.6.0.dll、jni4net.n.w64.v40-0.8.6.0.dll、jni4net.n-0.8.6.0.dll 拷贝进来
E) 将编译好的 C# 类库 MyCSharpDemoCalc.dll 也拷贝到上面的 work子目录中
F)在 work目录中建立 build.cmd

@echo off
if not exist target mkdir target
if not exist target\classes mkdir target\classes
echo compile classes
javac -nowarn -d target\classes -sourcepath jvm -cp "e:\javacallc#\jni4net-0.8.6.0-bin\lib\jni4net.j-0.8.6.0.jar"; "jvm\mycsharpdemocalc\ICalc.java" "jvm\mycsharpdemocalc\ICalc_.java" "jvm\mycsharpdemocalc\DemoCalc.java" "jvm\mycsharpdemocalc\patient.java" 
IF %ERRORLEVEL% NEQ 0 goto end
echo MyCSharpDemoCalc.j4n.jar 
jar cvf MyCSharpDemoCalc.j4n.jar  -C target\classes "mycsharpdemocalc\ICalc.class"  -C target\classes "mycsharpdemocalc\ICalc_.class"  -C target\classes "mycsharpdemocalc\__ICalc.class"  -C target\classes "mycsharpdemocalc\DemoCalc.class"  -C target\classes "mycsharpdemocalc\patient.class"  > nul

IF %ERRORLEVEL% NEQ 0 goto end
echo MyCSharpDemoCalc.j4n.dll 
csc /nologo /warn:0 /t:library /out:MyCSharpDemoCalc.j4n.dll /recurse:clr\*.cs  /reference:"E:\javaCallC#\jni4net-0.8.6.0-bin\samples\myCSharpDemoCalc\work2\MyCSharpDemoCalc.dll" /reference:"E:\javaCallC#\jni4net-0.8.6.0-bin\lib\jni4net.n-0.8.6.0.dll"

IF %ERRORLEVEL% NEQ 0 goto end
:end

G)在mycalc目录中建一个 java ant 编译脚本  build.bat
@echo off
copy ..\..\lib\*.* work

..\..\bin\proxygen.exe work\MyCSharpDemoCalc.dll -wd work2
cd work
call build.cmd
cd ..
echo compiling usage
javac -d work\ -cp work\jni4net.j-0.8.6.0.jar;work\MyCSharpDemoCalc.j4n.jar MyCalcUsageInJava.java

G)在cmd dos窗口中运行 mycalc目录 中的 build.bat即可进行编译l了,编译效果:

H)运行编译好的 jar包看看效果:
cd work
java -cp jni4net.j-0.8.6.0.jar;MyCSharpDemoCalc.j4n.jar;. MyCalcUsageInJava

今后只需要更新 C# dll即可,java代码无需重新编译,简单吧,很爽吧!

更多详情:http://kan.weibo.com/con/3636924272047381

有任何疑问欢迎随时找我交流:QQ群:74965947, 72133568,27236303,16592133,204725117,204724518

java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊的更多相关文章

  1. 留学生想要搞定Reading List?只需这三步即可

    听到有同学在抱怨“一本书都读不完,还怎么搞定reading list啊?”别急,小编这就来给你支招啦!你的文献阅读方法错了,读起来不仅效率低,而且无法做到熟练运用.因此,你需要以下这3步,就能搞定文献 ...

  2. 我能想到的最浪漫的Java网络教程之Socket,三步到位!!!

    简说 如果要使用Java中的TCP/IP通过网络连接到服务器,则需要创建一个java.net.Socket对象以连接到服务器.如果使用JavaNIO,则还可以在JavaNIO中创建SocketChan ...

  3. c# 三步递交模式调用同一个存储过程

    主要用于批量的sql操作:第一步创建中间表,第二步多次写数据到中间表,第三步 提交执行 创建三步递交的存储过程: CREATE PROC usp_testsbdj@bz int=0,@name VAR ...

  4. [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...

  5. vmware8~12最新版本 克隆Centos6.X 系列虚拟机网卡无法启动问题 (三步即可)

    1.因工作或者学习需要,都需要在VM上克隆一台服务器,此时无论是快捷克隆(相当于快照的机体)或者完整克隆,都会碰到IP问题. 如:创建后症状:启动之后使用ifconfig,发现无ip地址,只有回环地址 ...

  6. java基础之轻松搞定反射

    前言 java的名词太古怪.反射白话文解释,就是把一个字符串的类名,实例化,少了个new单词. 反射步骤 准备一个苹果类像这个样子. public class PingGuo { private St ...

  7. iview表格高度自适应只需要三步即可

    1. 需要增加到table表格里的 highlight-row :height="tableHeight" ref="table" 2.在return 定义一个 ...

  8. 【IO流】java中文件路径(相对路径、绝对路径)相关类及方法

    原文链接:https://blog.csdn.net/Activity_Time/article/details/98034409 1. URL 菜鸟教程:Java URL处理 通常推荐对http等协 ...

  9. 初学用记事本运行java报错:找不到或无法加载主类解决方法,部分出错解决办法

    刚开始学习java的人第一个程序可能通过记事本运行,当中间可能会会出现各种错误,我在下面间可能解决出现的问题 1. java环境变量没有安装好 以我的win10系统为例,在装好相应的jdk后,环境变量 ...

随机推荐

  1. Spring ioc容器

    一.ioc容器 ioc (inversion of  control)即控制反转,把某一个接口选择实现类的控制权转移给Spring容器来管理.调用类对该实现类的依赖关系由ioc容器注入(DI),传统的 ...

  2. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

  3. TCP/IP详解系列 --- 概念总结02

    TCP复位报文段(RST)的用途: 1.当客户端程序访问不存在的端口时,目标主机将给它发送一个复位报文段:收到复位报文段的一端应该关闭连接或者重新连接,而不能回应这个复位报文段. 2.当客户端程序向服 ...

  4. ST算法

    作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1. 方法:ST算法分成两部分:离线预处 ...

  5. DLL强名称引用问题

    为没有源码的DLL文件添加强名称 如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed ...

  6. 关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件。更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”。 如果没有安装的: 在系统提示更新的时候注意看一下,如果包含有“更新KB905474”就去掉“更新KB905474”方框前的勾,点击关闭(注意如果没有去掉那个勾得话,会找不到“关闭”,而是“确定”),在不在提示我该消息前打勾。 如果已经安装

    关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件.更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”. 如果没有安装的: 在系统提示更新的时候 ...

  7. 安装 CentOS 后的系统配置及软件安装备忘

    安装 CentOS 后的系统配置及软件安装备忘 // */ // ]]>   安装 CentOS 后的系统配置及软件安装备忘 Table of Contents 1 Linux 自举过程 1.1 ...

  8. 设计模式:Context模式

    作者:吴香伟 发表于 2014/09/12 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Ceph实现中使用了大量派生于Context抽象类的子类,用法简单却很 ...

  9. Maemo平台上如何使用Openvpn

    Maemo是一个开源的智能手机软件平台社区,它是基于Debia的LInux发行版本,Maemo的大多是开源的,并已经制定了Maemo和诺基亚内部的设备与许多开源项目,例如,Debian的Linux内核 ...

  10. MyBatis-NET

    http://www.codeproject.com/Articles/894127/MyBatis-NET https://mybatis.github.io/mybatis-3/