java调用C#动态库

前言

借助于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

你可能感兴趣的:(java)