项目需要java调用C#dll动态库文件,从来没开发过C#。先研究了JNA和JNI,这都需要在C#上通过C++再次封装,无法满足项目要求。
又找了CLE 公共语言扩展,开始没有细看网站说明,直接下载jar包就开发了。正在欣喜这个非常满足要求时,才发现目前java调C#不支持linux系统,唉!又是无奈的尝试。
最后还是考虑通过python调用C#,虽然不专业,多少也用过python。python中有个pythonnet模块有clr,非常好用,win和linux系统都完美支持。linux下安装pythonnet需要注意依赖的模块都要安装好还有就是mono环境也要安装好。
写的比较乱。win下比较好安装,只贴下linux系统安装步骤吧:
C#运行环境
net环境安装,可离线安装,注意依赖文件
[root@localhost ~]# sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
[root@localhost ~]# sudo yum update
[root@localhost ~]# sudo yum install dotnet-sdk-2.2
------安装mono
[root@localhost ~]# rpm --import "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
[root@localhost ~]# su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'
[root@localhost ~]# sudo yum install mono-devel
[root@localhost ~]# sudo yum install mono-complete
[root@localhost ~]# sudo yum install msbuild //非常重要
[root@localhost ~]# sudo yum install clang //非常重要
[root@localhost ~]# sudo yum install epel-release //部分机器需要安装
----安装pythonnet2.4.0.zip,这是最新版的,尝试其他版本都没有成功。python环境安装就不贴了,网上一大把
[root@localhost home]# unzip pythonnet-2.4.0.zip
[root@localhost home]# cd pythonnet-2.4.0-rc1/
[root@localhost pythonnet-2.4.0-rc1]# python setup.py install
java代码:
public static void main(String[] args) {
/**
* java通过python调用C#dll库
*/
String line = "";
String reStr = "";
Map<Integer, Object> map = new HashMap<>();
String sKey ="22222222222222333333";
String[] ars = new String[] {"python", "/home/jymx/Csharp/loadCsharp.py",sKey,"Demo.dll"};
try {
Process pr = Runtime.getRuntime().exec(ars);
pr.waitFor();
InputStreamReader ir = new InputStreamReader(pr.getInputStream(),"utf-8");
BufferedReader in = new BufferedReader(ir);
while ((line = in.readLine()) != null) {
reStr += line;
}
System.out.println(reStr);
in.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
loadCsharp.py 代码:
import clr
import sys
import system
import os
sKey = sys.argv[1]
pgName =sys.argv[2]
sys.path.append(r"/home/jymx/Csharp")
# 加载c#dll文件
name =pgName[:-4]
clr.AddReference(name)
# 导入C#命名空间
from Jymx import *
#实例化C#类
qd = QueryJymx()
str = qd.queryData(sKey)
print(str)
---------------
py文件要和dll文件放在同一目录。