Java调用C# DLL的方法简介
By 潘伟 2012-8-7
关于java调用C# 封装的DLL文件的方法
第一种:java利用JNA进行调用
思路:C#源码生成COM组件(dll和tlb文件),再利用C++进行封装,java通过JNA调用C++封装的DLL。
第二种:java利用jacob进行调用
第一种  java利用 JNA调用C# DLL
需安装Visual Studio 2010 ,下载jna.jar(解压放置于jdk_home/jre/lib/ext目录下)。
第一步:利用C#写COM组件
1、新建一个类库项目文件—新建—项目—类库;命名:COMTest);//根据实际需要取文
件名
2、生成.cs主文件 ;
COMTestClass.cs
namespace COMTest
{
    public interface COMTestIfce
    {
        int add(int a, int b);
        void say( string str);
        bool isCOM1(string portName);
    };
    public class COMTestClass : COMTestIfce
    {
        public int add(int a, int b)
        {
            return a + b;
        }
        public voidjava jna say(string str)
        {
            Console.WriteLine(str);
        }
        public bool isCOM1(string portName)
        {
            if (portName.Equals("COM1"))
            {
                Console.WriteLine("1true");
                return true;
            }
            else
            {
                Console.WriteLine("2false");
                return false;
            }
        }
    }
}
3、右键点击工程->应用程序->程序集信息->使程序集com可见,打上勾
4、右键点击工程->生成->为com Interop注册 打上勾
5、设置强签名
由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运行目标机器注册的情况,对此.Net下编译的COM组件必须为程序进行签名,即强命名密钥;
打开Visual Studio Command Prompt 输入:sn -k MyKeyFire.snk 生成MyKeyFire.snk 文件,注意路径。(.snk文件可以随意取,但.snk后缀名别忘记了)
在签名 标签中选中 为程序集签名,选择刚刚生成的强名称文件MyKeyFire.snk 。
6、 在“解决方案资源管理器”中到节点“Properties”打开AssemblyInfo.cs文件
如下图
7、 将[assembly: ComVisible(false)]属性改成[assembly: ComVisible(true)]
如下图
8、编译程序,\bin\Debug目录中会生成 COMTest.dll 和COMTest.tlb文件。
第二步:利用C++进行再封装
1、创建C++ DLL项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程序类型:DLL
2、添加类,类名:COMTest_Bridge,.h名:COMTest_Bridge.h,.cpp名:COMTest_Bridge.cpp,然后生成项目;
3、把第一步生成的COMTest.dll 和COMTest.tlb文件放入C++项目下的Debug文件夹下。
4、注册COM组件:
4.1打开Visual Studio Command Prompt进入Debug目录,运行命令注册:
gacutil -i  .dll全文件名;regasm .dll全文件名;
5、编辑COMTest_Bridge.h和COMTest_Bridge.cpp文件:
COMTest_Bridge.h
// COMTest_Bridge.h
#pragma once
#define DLL_EXPORT extern "C"  __declspec(dllexport)
    DLL_EXPORT int CPPadd(int a,int b);
    DLL_EXPORT void CPPsay(char* str);
    DLL_EXPORT bool isCOM1(char* portName);
COMTest_Bridge.cpp
注意:
1)、基本类型转换对应时。C#和java 中的String对应于C++的char*及COM组件中的_bstr_t
2)、注意按顺序引用头文件,否则无法编译
// COMTest_Bridge.cpp :
// Dies ist die Haupt-DLL.
#include "stdafx.h"
#include <iostream>
#include  < string >
#include "COMTest_Bridge.h"
#import "..\Debug\COMTest.tlb"
using namespace std;
using namespace System;
using namespace COMTest;
int  CPPadd(int a,int b){
    HRESULT com=CoInitialize(NULL);
    COMTestIfcePtr comTest(__uuidof(COMTestClass));
    int result = comTest->add(a,b);
    CoUninitialize();
    return result;
}
void  CPPsay(char* str){
    HRESULT com=CoInitialize(NULL);
    COMTestIfcePtr comTest(__uuidof(COMTestClass));
    comTest->say(str);
    CoUninitialize();
}
bool isCOM1(char* portName){
    HRESULT com=CoInitialize(NULL);
    COMTestIfcePtr comTest(__uuidof(COMTestClass));
    bool result =    comTest->isCOM1(portName);
    CoUninitialize();
    return  result;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。