欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java调用C#动态库  

程序员文章站 2022-06-10 07:49:42
...

前言

借助于CLE,可以很容易在java中使用C#的动态库,这里通过一个简单的例子说明。使用CLE,需要预先安装http://www.srplab.com/Data/starcore_win32.2.0.3.exe.

下面是一段C#的代码,非常简单:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using star_csharp;

namespace testcs
{
public class Class1
{
public Class1(stringmsg,floatnum)
{
Console.WriteLine("Demo...");
Console.WriteLine(num);
}
public stringgetMessage(stringmsg)
{
return "hello "+msg;
}
}
}
代码包含一个构造函数,和一个getMessage函数,该函数输入为一个字符串,返回1个字符串。
把上面的代码编译成为动态库,使用下面的命令。
csc /reference:c:\srplab\libs\star_csharp.dll /target:library /platform:x86 testcs.cs

java调用C#生成的动态库,首先需要初始化CLE

使用下面的代码:

import com.srplab.www.starcore.*;
public class test{
public static void main(String[] args){
StarCoreFactory starcore=StarCoreFactory.GetFactory();
StarServiceClass Service=starcore._InitSimple("test","123",0,0);
StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup");

SrvGroup._ClearService();
starcore._ModuleExit();
}

}

调用C#


1. 使用_InitRaw初始化C#接口


SrvGroup._InitRaw("csharp",Service);

输入参数:第一个字符串为接口的名称,可以是”csharp”,”csharp4”,”csharp45”, 分别对应于.Net3.5, .Net4.0和.Net4.5。第二个参数为初始化时创建的服务对象。


2. 使用_LoadRawModule装载C#动态库


SrvGroup._LoadRawModule("csharp","testcs","testcs.dll",false);

输入参数:第一个是接口名称,第二个是程序集的名称,第三个是动态库的文件名,第四个参数为bool类型,输入false即可。


3. 使用_ImportRawContext导入C#动态库中的类


StarObjectClass Class1 = Service._ImportRawContext("csharp","testcs.Class1",true,"");

输入参数,第一个是接口名称,第二个是完整的类的名称,第三个参数设置为true,表示导入的是1个类。第四个参数保留,固定设置为””。


4. 使用_New函数分配1个类的实例


StarObjectClass inst = Class1._New("","","cle value",44);

输入参数:前两个分别为新对象的名称,以及初始化lua字符串,设置成为空即可。后面为构造函数的参数。


5. 使用_Call函数调用类的成员函数


String Result = (String)inst._Call("getMessage","java");

输入参数:第一个是要调用的函数名称,后面的参数是函数的参数。返回值需要根据函数的返回类型,转换成为对应的数值。


完整的代码如下:


import com.srplab.www.starcore.*;

public class test{
public static void main(String[] args){
StarCoreFactory starcore=StarCoreFactory.GetFactory();
StarServiceClass Service=starcore._InitSimple("test","123",0,0);
StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup");

//--init csharp raw interface ---*/
SrvGroup._InitRaw("csharp",Service);
//--load csharp module ---*/
SrvGroup._LoadRawModule("csharp","testcs","testcs.dll",false);
//--attach object to testcs.Class1 ---*/
StarObjectClass Class1 = Service._ImportRawContext("csharp","testcs.Class1",true,"");
StarObjectClass inst = Class1._New("","","cle value",44);
String Result = (String)inst._Call("getMessage","java");
System.out.println(Result);

SrvGroup._ClearService();
starcore._ModuleExit();
}
}
java代码用javac编译之后,运行
java test
可以看到正确的输出结果。

如果需要在没有安装CLE的机器上运行,需要将 “libstarcore.dll” “star_java.dll” “star_csharp.dll” “starcore.jar” 拷贝到当前目录,并在运行时指定starcore.jar
java -classpath ./;starcore.jar test