`
sunandmoon
  • 浏览: 13856 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

java调用.Net的类库dll文件

阅读更多

     最近项目开发中,需要用java去调用.net开发团队提供的service。一开始以为是以url形式提供的webservice去调用。后来才知道.net项目组提供给我们一个dll文件说里面有有两个方法供调用,一个是发送邮件的,一个是发送短信的。那么如何在通过java去调用这个用C#实现的类库中的方法呢。通过搜索一些资料最后终于实现了,下面说说是如何实现的,挺有意思的

 

一、实现方法的选择

1、基本概念的介绍

DLL:动态链接库(Dynamic   Link   Library,缩写为DLL)是一个可以其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drvsysfon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。

 

TLB(TLB=Lib): .lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。

    

     COM组件: 标准的 COM 组件存在 方式有两种, 一种是你看到的 DLL 还有一个方式是 EXE (进程外).

注:关于DLLTLB的区别详细信息请参考如下资源

http://www.goupaiba.com/redirect.php?fid=21&tid=82&goto=nextoldset

http://www.winu.cn/ask/question.php?qid=18229

2、Java调用DLL文件的几种方法

 

使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob

其中JNI(Java Native Interface)Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。

JawinJacob都是sourceforge.net的开源项目,都是基于JNI技术的依赖Windows的实现,使得在Windows平台下使用COMDLL的更加方便。

 

JNI介绍:

sun相关文档http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html

JNI的完整例子 http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html

JNI的应用方案是基于Java类和本地函数相映射的。其使用DLL的步骤还是相对比较麻烦,不但涉及到Java编程,还涉及到C/C++编程。

 

JaWin介绍:

官方网站http://jawinproject.sourceforge.net/
官方文档(Jawin介绍):
http://jawinproject.sourceforge.net/jawin.html
官方文档(Jawin使用DLL)
http://jawinproject.sourceforge.net/jawinuserguide_dll.html
官方文档(Jawin数据指令): http://jawinproject.sourceforge.net/instruction_docs.html

 

Jacob介绍:

官方文档:http://danadler.com/jacob/

JacobJava-Com Bridge的缩写,也可以用来调用DLL。其底层也是使用JNI实现,也具有Windows 的平台依赖性,由于网上有人反映其易用性不如jawin,所以没有深入了解。

 

二、            Java调用.Net产生的DLL

实例讲解:

准备工作:

1.      http://jawinproject.sourceforge.net/上下载JaWin工具包

2.      配置:

jawin.jar放于%JAVA_HOME%\jre\lib\ext下。

jawin.dll放于c:\winnt\system32下。否则将出现错误:COMException : no jawin in java.library.path

3.      安装.netFrameWork环境。

 

 

环境已经配置好了,下面我们就从开始动手实现;

1、新建如下两个cs文件

HelloFromNETItf.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Org.Jawin.NETTest {
	   public interface HelloFromNETItf {
	    void ShowDialog(string str);
      void test(string s);
	}
}

  

 

 

 

 

HelloFromNET.cs

 

 

using System;
using System.Runtime.InteropServices; // necessary for the Guid and ProgId attributes

namespace Org.Jawin.NETTest {
	public class HelloFromNET : HelloFromNETItf {
		// Need a public default no-arg constructor for COM Interop.
		public HelloFromNET() {
		}
		public void ShowDialog(string str) {
          Console.WriteLine(str);
		}
     public void test(string s) {
         Console.WriteLine("test" + s);
     }
	}
}

 

说明:上面的两个.cs文件相当于我们java中的两个.java文件。声明了一个接口,接口中声明了两个方法。另一个类去实现这个接口。

 

2.把上面写好的两个文件编译成.DLL文件

 1首先找到.netFrameFork的安装路径类似如下

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

把这个路径配置到系统的环境变量path下,这样我们就可以方便的使用.net提供的一些命令了。比如我们下面要用到了csc命令和regasm命令。

       2cmd命令进入命令行提示符界面,路径定位到两个cs文件存放的位置

      

 

 

输入csc /target:library /out:hellotest.dll *.cs把两个文件编译成hellotest.dll

C:\>csc /target:library *.cs /r:c:\LotusMail.dll /r:c:\ Interop.Domino.dll

C:\>csc /target:library *.cs /r:c:\SendMail.dll /r:c:\SendSMTPdll /r:c:\ Interop.Domino.dll

 

输入regasm /tlb hellotest.dll命令生成hellotest.tlb文件

 

 

 

到现在位置我们要调用的dll文件就做好了。

 

3.编写cs文件调用dll,并作为中间件共以后Java调用

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Org.Jawin.NETTest
{
    [Guid("3823a63d-5891-3b4f-A460-DB0FB847075F")]
    public interface TestHelloFromNETItf
    {
        void ShowDialog(string str, string caption);
    }
}

 

上面的连个文件实现了调用我们生成的DLL

注意:上面的接口和实现类和我们做dll时基本是一样的只是多了

[Guid("25c2f5a2-1afe-36ce-BE27-84E040F5E19F")]

[ProgId("Jawin.HelloFromNET6")] // Register the CLSID under this shortcut

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID

[assembly: Guid("ea17fc17-9995-425c-bf18-62c02087bdd6")]

 

至于guid的生成方法如下:

 

using System;
using Org.Jawin.NETTest;
using System.Reflection;
using System.Runtime.InteropServices;
namespace Org.Jawin.NETTest
{
    [Guid("25c2f5a2-1afe-36ce-BE27-84E040F5E19F")]
    [ProgId("Jawin.HelloFromNET6")] // Register the CLSID under this shortcut ProgId
    public class TestHelloFromNET : TestHelloFromNETItf
    {
        // Need a public default no-arg constructor for COM Interop.
        public TestHelloFromNET()
        {
        }
        public  void ShowDialog(string str,string caption)
        {
            System.Reflection.Assembly ass;
            Type type;
            Object obj;

            ass = Assembly.Load("hellotest");
            type = ass.GetType("Org.Jawin.NETTest.HelloFromNET");
            MethodInfo[] miarr = type.GetMethods();
            obj = ass.CreateInstance("Org.Jawin.NETTest.HelloFromNET");
            MethodInfo method = type.GetMethod("ShowDialog");
            method.Invoke(obj, new string[] { "WriteString"});
            //Org.Jawin.NETTest.HelloFromNETItf hfn = new HelloFromNET();
            //hfn.ShowDialog(str);
            Console.WriteLine("testtttttttttttttttttttttttt");         
        }
    }
}

 

上面的连个文件实现了调用我们生成的DLL

注意:上面的接口和实现类和我们做dll时基本是一样的只是多了

[Guid("25c2f5a2-1afe-36ce-BE27-84E040F5E19F")]

[ProgId("Jawin.HelloFromNET6")] // Register the CLSID under this shortcut

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID

[assembly: Guid("ea17fc17-9995-425c-bf18-62c02087bdd6")]

 

至于guid的生成方法如下:

 

输入guidgen命令会出现如下窗口

 

选择第四个registry 然后点new guidcopy放到我们的cs文件上即可。

接下来我们用上面同样的命令把这两个文件编译成dll文件和tlb文件。

注意:生成的dll文件和tlb文件要放在下面目录中的

%WINDIR%/system32, %JAVA_HOME%/bin or %JAVA_HOME%/jre/bin其中一个,一般都放在%JAVA_HOME%/bin下,如果后面java调用dll的时候报错可以尝试放在其他目录尝试。

 

到此位置.net方面的工作我们就做完了。下面我们开始编写java代码调用dll中间件。

 

/*
 * HelloFromNETItf.java -
 *
 * This file is part of the Jawin Project: http://jawinproject.sourceforge.net/
 * 
 * Please consult the LICENSE file in the project root directory,
 * or at the project site before using this software.
 */

/* $Id: HelloFromNETItf.java,v 1.2 2004/07/18 14:56:59 arosii_moa Exp $ */

package demos;

import org.jawin.*;

/**
 * Modified version of JTB generated code
 *
 * @version     $Revision: 1.2 $
 * @author      Morten Andersen, arosii_moa (at) users.sourceforge.net
 */
public class HelloFromNETItf extends DispatchPtr {
	public static final GUID DIID = new GUID("{3823a63d-5891-3b4f-A460-DB0FB847075F}");
	public static final int iidToken;
	static {
		iidToken = IdentityManager.registerProxy(DIID, HelloFromNETItf.class);
	}

	/**
	 * The required public no arg constructor.
	 * <br><br>
	 * <b>Important:</b>Should never be used as this creates an uninitialized
	 * HelloFromNETItf (it is required by Jawin for some internal working though).
	 */
	public HelloFromNETItf() {
		super();
	}

	/**
	 * For creating a new COM-object with the given progid and with 
	 * the HelloFromNETItf interface.
	 * 
	 * @param progid the progid of the COM-object to create.
	 */
	public HelloFromNETItf(String progid) throws COMException {
		super(progid, DIID);
	}

	/**
	 * For getting the HelloFromNETItf interface on an existing COM-object.
	 * This is an alternative to calling {@link #queryInterface(Class)}
	 * on comObject.
	 * 
	 * @param comObject the COM-object to get the HelloFromNETItf interface on.
	 */
	public HelloFromNETItf(COMPtr comObject) throws COMException {
		super(comObject);
	}

	/**
	 * For creating a new COM-object with the given clsid and with 
	 * the HelloFromNETItf interface.
	 * 
	 * @param clsid the GUID of the COM-object to create.
	 */
	public HelloFromNETItf(GUID clsid) throws COMException {
		super(clsid, DIID);
	}

	public int getIIDToken() {
		return iidToken;
	}
	
   
   
    /**
    *
    
    * @param str
    * @return void
    **/
    public void ShowDialog(String str,String caption) throws COMException
    {
      
		invokeN("ShowDialog", new Object[] {str,caption});
        
    }
}


/*
 * HelloNET.java -
 *
 * This file is part of the Jawin Project: http://jawinproject.sourceforge.net/
 * 
 * Please consult the LICENSE file in the project root directory,
 * or at the project site before using this software.
 */

/* $Id: HelloNET.java,v 1.1 2004/07/05 11:55:59 arosii_moa Exp $ */

package demos;

import org.jawin.GUID;
import org.jawin.win32.Ole32;


/**
 * Demo showing how to call .NET code published as a COM object.
 * The .NET C# source is in the demos/net folder.
 *
 * @version     $Revision: 1.1 $
 * @author      Morten Andersen, arosii_moa (at) users.sourceforge.net
 */
public class HelloNET {

	/**
	 * CLSID for the HelloFromNET COM object
	 */
	public static final GUID CLSID = new GUID("{25c2f5a2-1afe-36ce-BE27-84E040F5E19F}");

	/**
	 * ProgID for the HelloFromNET COM object - could be used instead of the CLSID
	 */
	public static final String PROG_ID = "Jawin.HelloFromNET6";

	public static void main(String[] args) {
		try {
			Ole32.CoInitialize();
			HelloFromNETItf hello = new HelloFromNETItf(PROG_ID);
//			hello.setCaption("Jawin .NET test");
			hello.ShowDialog("Hello from .NET","test");
			hello.close();
			Ole32.CoUninitialize();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

上面的2个java文件实现了调用.net中间件。

  • 大小: 61.9 KB
  • 大小: 10.4 KB
  • 大小: 6.2 KB
  • 大小: 25.8 KB
  • 大小: 10.5 KB
分享到:
评论

相关推荐

    java项目jar包转dll文件.net引用

    IKVM.NET是一个开源项目,它实现了Java虚拟机的部分功能,并且提供了一种方式将Java类库转换为.NET兼容的DLL文件。在这个过程中,IKVM.NET将Java字节码转换为.NET IL(Intermediate Language),使得.NET环境可以...

    java调用C#封装的dll方法

    ### Java调用C#封装的DLL方法 #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java...

    JAVA类库转换成C#类库工具

    - 它还提供了一个.NET封裝层,使得.NET代码可以透明地调用Java类库的方法和访问字段。 - IKVM.NET还包含一个Java标准库的.NET实现,这样C#程序就可以使用诸如`java.lang`、`java.util`等Java标准包中的类。 2. **...

    Java调用C#DLL

    在Java中调用C# DLL,我们需要借助一些中间层技术,因为Java原生并不支持直接调用.NET DLL。以下是一种常用的方法: 1. **JNI(Java Native Interface)**:Java提供的原生接口,允许Java代码调用本地(如C、C++)...

    java调用ocx控件,jacob,jar和dll文件

    下面将详细介绍这一过程,以及涉及到的jar和dll文件。 Jacob是一个开源项目,它为Java提供了与COM接口交互的能力,允许Java代码直接调用Windows API和OCX控件。Jacob的核心在于一个名为`jacob.jar`的Java类库,它...

    c# 调用java类库

    2. 编译为DLL:将Java代理类编译为.NET可理解的DLL文件。这可以通过JNBridge或其他工具完成,将Java字节码转换为CLI(Common Language Infrastructure)兼容的库。 3. 在C#中引用DLL:在C#项目中,添加对生成的DLL...

    Java调用C#的DLL实现方案.rar

    然而,JNA并不支持.NET Framework的特性,如托管代码或.NET类库,所以它不能直接调用C# DLL。 3. **P/Invoke** P/Invoke是.NET Framework提供的一种特性,允许C#代码调用非托管的DLL函数。然而,P/Invoke是单向的...

    jar文件 变成dll

    4. **测试转换结果**:转换完成后,在.NET环境中导入生成的DLL,就可以像使用.NET类库一样调用Java代码了。需要注意的是,由于.NET与Java的API差异,可能需要对部分API进行适配。 **注意事项:** - 转换过程可能会...

    Java调用C#的DLL实现方案.docx

    这里提供了一种Java调用C#DLL的方法,主要涉及以下几个关键步骤: 1. **环境准备**: 首先,确保你拥有合适的开发环境。在这种情况下,使用的是Visual Studio 2019的社区版,它包含了.NET桌面开发、C++桌面开发...

    JNA方式实现Java调用dll的必用jar包

    标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来调用Windows平台上的动态链接库(.dll文件)所需的Java类库。这个"jna5.jar"文件是JNA的一个版本,其中包含了所有必要的组件,使得Java程序能够通过JNA...

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的。 假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 ...

    Java 调用 C# DLL

    在C#中,我们可以编写一个公共类库项目,导出一些公共接口和方法,然后生成DLL文件。这些接口和方法可以被其他.NET应用程序,包括C#、VB.NET等调用。然而,Java作为非.NET环境的语言,无法直接调用C# DLL。 为了...

    jar转dll.zip

    Java的JAR文件和.NET的DLL文件分别代表了两种不同的运行环境——Java虚拟机(JVM)和.NET Framework。然而,有时我们需要在.NET环境中调用Java的库,这时就需要将JAR转换为DLL。"jar转dll.zip"提供了一种解决方案,...

    在Java 虚拟机与.NET CLR运行时进行交互集成的程序代码例子

    - 编译并生成DLL,然后在Java代码中加载这个DLL,通过JNI接口调用.NET方法。 总结起来,Java虚拟机与.NET CLR的交互集成涉及多种技术和策略,包括JNI、P/Invoke、COM Interop、Managed Java Bridge、IKVM.NET以及...

    Ndoc .net 的类库文档生成工具(支持.net 2.0)

    5. **NDoc.Documenter.JavaDoc.dll**:对于熟悉 Java 开发的用户,这个组件可以将文档生成为 JavaDoc 风格,使得 .NET 开发者可以轻松地将现有的 JavaDoc 文档转换到 .NET 平台。 6. **NDoc.Documenter.Latex.dll**...

    IKVM.NET 8.1.15

    IKVM.NET 8.1.15是该项目的一个版本,它允许开发者将Java的.jar文件转换为.NET的.dll文件,从而在C#或其他.NET语言中调用Java类库。 在IKVM.NET中,Java虚拟机(JVM)的功能被模拟,使得Java字节码能够被.NET ...

    java包转c#dll

    IKVM.NET是一个开源项目,由Glenn Block创建,其目的是在.NET平台上实现Java虚拟机,并且提供了一个工具集,包括ikvmc,可以将Java的类库编译为.NET的中间语言(IL),进而生成C#可使用的DLL文件。 1. **IKVM编译...

    dll.rar_Java 生成dll_Java程序转为c#调用时需要的dll包_jdk 生成 dll

    将Java的.jar文件(包括我们的Java类和所需的依赖)转换为.NET的.dll文件。命令行可能如下: ```bash ikvmc -target:library MyLibrary.jar -out:MyLibraryNet.dll ``` 7. **在C#中调用DLL**:现在,C#程序可以...

    jcom的jar及dll文件

    - **作用**:这种交互可能涉及到数据交换、调用.NET库的功能,或者利用.NET的特性,比如图形处理、加密算法等,这些都是Java标准库可能不提供的。 3. **跨平台通信**: - **JNI**:Java Native Interface是Java...

Global site tag (gtag.js) - Google Analytics