CN101674333A - 非托管语言与.net服务端交互及其生成方法、装置、系统 - Google Patents

非托管语言与.net服务端交互及其生成方法、装置、系统 Download PDF

Info

Publication number
CN101674333A
CN101674333A CN200910235516A CN200910235516A CN101674333A CN 101674333 A CN101674333 A CN 101674333A CN 200910235516 A CN200910235516 A CN 200910235516A CN 200910235516 A CN200910235516 A CN 200910235516A CN 101674333 A CN101674333 A CN 101674333A
Authority
CN
China
Prior art keywords
service end
net service
rmi
client
language
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN200910235516A
Other languages
English (en)
Other versions
CN101674333B (zh
Inventor
陆舟
于华章
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Feitian Technologies Co Ltd
Original Assignee
Beijing Feitian Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Feitian Technologies Co Ltd filed Critical Beijing Feitian Technologies Co Ltd
Priority to CN2009102355163A priority Critical patent/CN101674333B/zh
Publication of CN101674333A publication Critical patent/CN101674333A/zh
Application granted granted Critical
Publication of CN101674333B publication Critical patent/CN101674333B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种非托管语言与.NET服务端交互及其生成方法、装置、系统,涉及计算机技术领域,解决了现有技术中非托管语言不能与.NET服务端进行通信的问题。本发明实施例将客户端发起的非托管语言访问请求转换为远程方法调用规范格式;将远程方法调用规范格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范格式的运行结果;对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。本发明实施例主要用在各种采用非托管语言的客户端中,用来通过该客户端顺利访问.NET服务端。

Description

非托管语言与.NET服务端交互及其生成方法、装置、系统
技术领域
本发明涉及计算机技术领域,尤其涉及计算机语言中非托管语言与.NET服务端交互方法、装置及系统,以及该交互装置对应的生成方法和装置。
背景技术
.NET是基于互联网的跨语言软件开发平台,顺应了当今软件工业分布式计算、面向组件、企业级应用、软件服务化和以Web为中心等大趋势。.NET并非开发语言,但是.NET开发平台可以支持多种开发语言,如:C#语言、C++、VisualBasic、Jscript等。.NET卡是基于.NET技术平台的虚拟机,能够模拟运行各种指令,在.NET卡中含有并可以运行.NET程序,并且.NET卡上运行的软件对运行环境没有特殊要求。
.NET开发平台所支持的开发语言一般是由公共语言运行库(CLR)环境执行的代码,这种代码称为托管代码(managed code)。应用托管代码所开发出的应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
Microsoft.NET Remoting(Microsoft.NET远程方法调用规范)提供一种允许对象通过应用程序域与另一对象进行交互的框架,并且Microsoft.NETRemoting提供了一个可扩展的框架,它可以选择不同的传输机制(HTTP和TCP是内置的)、不同的编码方式、安全设置(IIS或SSL),同时提供多种服务,包括激活和生存期支持。
例如,.NET服务端是可以运行.NET程序的服务端,通过C#语言开发的应用程序需要访问.NET服务端时,可以采用C#语言规范提供的C/S(Client/Server,客户机/服务器)模式进行的远程调用。但是在对.NET服务端进行远程调用时,.NET服务端中的服务只能通过C#的Remoting(远程方法调用规范)机制和传统APDU的方式访问,这种调用模式需要所采用的语言能够支持类和程序集。
因此,在对.NET服务端进行远程调用的应用过程中,发明人发现现有技术中至少存在如下问题:对于在CLR环境外部,由操作系统直接执行的非托管代码(Unmanaged Code)而言,由于C语言等非托管语言不支持类和程序集的概念,调用.NET服务端时存在种种局限,给.NET服务端的推广和发展带来了很大的局限性。
发明内容
本发明提供一种非托管语言与.NET服务端交互及其生成方法、装置、系统,使得非托管语言能够与.NET服务端进行交互实现远程调用。
为达到上述目的,本发明采用如下技术方案:
一种非托管语言与.NET服务端交互方法,包括:
将客户端发起的非托管语言访问请求转换为远程方法调用规范格式;
将远程方法调用规范格式的访问请求发送到.NET服务端;
接收.NET服务端返回的远程方法调用规范格式的运行结果;
对远程方法调用规范格式的运行结果进行解析得到返回值;
将所述返回值返回给所述客户端。
一种非托管语言与.NET服务端交互装置,包括:
转换单元,用于将客户端发起的非托管语言访问请求转换为远程方法调用规范格式;
发送单元,用于将远程方法调用规范格式的访问请求发送到.NET服务端;
接收单元,用于接收.NET服务端返回的远程方法调用规范格式的运行结果;
解析单元,用于对远程方法调用规范格式的运行结果进行解析得到返回值;
返回单元,用于将所述返回值返回给所述客户端。
一种非托管语言与.NET服务端交互系统,包括客户端、.NET服务端;还包括非托管语言与.NET服务端交互装置;
所述客户端用于向所述.NET服务端发起的非托管语言访问请求;
所述非托管语言与.NET服务端交互装置用于将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;
所述.NET服务端用于运行所述访问请求;
所述非托管语言与.NET服务端交互装置还用于接收.NET服务端返回的远程方法调用规范格式的运行结果;对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
一种非托管语言与.NET服务端交互装置的生成方法,包括:
获取被下载到.NET服务端中的可执行文件的远程调用信息;
根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;
根据生成的所述非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;
将预先定义的中转函数加入所述函数定义文件;
所述中转函数用于:将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范格式的运行结果,并对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
一种非托管语言与.NET服务端交互装置的生成装置,包括:
获取单元,用于获取被下载到.NET服务端中的可执行文件的远程调用信息;
第一生成单元,用于根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;
第二生成单元,用于根据所述第一生成单元生成的非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;
加入单元,用于将预先定义的中转函数加入所述函数定义文件;
所述中转函数用于:将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范格式的运行结果,并对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
本发明提供的非托管语言与.NET服务端交互及其生成方法、装置、系统,通过提取.NET服务端中可执行文件的远程调用信息,生成非托管语言的函数声明文件和函数定义文件,并在函数定义文件中写入中转函数。中转函数主要用来将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;中转函数在接收.NET服务端返回的远程方法调用规范格式的运行结果后,对远程方法调用规范格式的运行结果进行解析得到返回值,并将所述返回值返回给所述客户端。
在非托管语言需要访问.NET服务端时,需要将上述函数声明文件和函数定义文件写入非托管语言的工程,以便在运行非托管语言程序时,能够通过中转函数的功能调用.NET服务端的服务,使得非托管语言能够与.NET服务端进行交互实现远程调用,解决了非托管语言程序调用.NET服务端存在局限性的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例1中非托管语言与.NET服务端交互方法流程图;
图2为本发明实施例1中非托管语言与.NET服务端交互装置框图;
图3为本发明实施例1中非托管语言与.NET服务端交互系统框图;
图4为本发明实施例1中非托管语言与.NET服务端交互装置的生成方法流程图;
图5为本发明实施例1中非托管语言与.NET服务端交互装置的生成装置框图;
图6为本发明实施例2中非托管语言与.NET服务端交互具体运用的流程图;
图7为本发明实施例2中可执行文件元数据表的示意图;
图8为本发明实施例3中非托管语言与.NET服务端交互装置框图;
图9为本发明实施例3中非托管语言与.NET服务端交互系统框图;
图10为本发明实施例3中非托管语言与.NET服务端交互装置的生成装置框图。
具体实施方式
.NET服务端是微软的新一代技术平台,是全新的基于互联网的跨语言软件开发平台可以支持多种开发语言,如C#语言、C++、Visual Basic、Jscript等。然而,在公共语言运行库(CLR)环境的外部,由操作系统直接执行的非托管语言,例如C语言,由于不支持类的概念、或者不支持类和程序集的概念,调用.NET服务端服务存在着局限,不能直接按照上述调用模式进行,为解决此问题,本发明实施例提供非托管语言与.NET服务端交互方法、装置、系统及生成方法和装置。
下面以非托管语言调用.NET服务端的服务为例结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1:
本发明实施例提供一种非托管语言与.NET服务端交互方法,如图1所示,该交互方法包括如下过程:
101、在采用非托管语言的客户端需要与.NET服务端进行通信时,客户端会发起一个非托管语言的访问请求,本实施例中需要将该访问请求转换为远程方法调用规范(Remoting)格式;
其中,远程方法调用规范格式具体为Remoting格式,将访问请求转换为远程方法调用规范(Remoting)格式就是一种数据分析,具体为获取访问请求所需的类名、函数名、参数等,并将该获取的类名、函数名、参数等有序存放,具体的实现方式可以采用但不限于:如实施例2中步骤607中的实现Remoting打包,构造Remoting Header,构造参数Object的方法;
上述的非托管语言主要指在CLR环境外部由操作系统直接执行的语言,例如:C语言;
102、由于.NET服务端支持远程方法调用规范(Remoting)格式的访问请求,本实施例中可以将上述远程方法调用规范(Remoting)格式的访问请求发送到.NET服务端,以便.NET服务端运行访问请求相应的操作;
103、.NET服务端运行后会将运行结果返回,本实施例中还需要接收.NET服务端返回的远程方法调用规范(Remoting)格式的运行结果;
104、然后对远程方法调用规范(Remoting)格式的运行结果进行解析得到返回值;
其中,解析具体的实现方式可以采用但不限于:实施例2步骤607中的Remoting的解包,返回值的参数个数,解析Remoting Header,解析返回值的参数,和返回值。
105、最后本发明实施例将所述返回值返回给所述客户端,最终完成客户端与.NET服务端之间的通信。
本发明实施例还提供一种非托管语言与.NET服务端交互装置,如图2所示,该交互装置包括:转换单元21、发送单元22、接收单元23、解析单元24和返回单元25。
在采用非托管语言的客户端向.NET服务端发起一个非托管语言的访问请求后,本发明实施例中的转换单元21用于将该访问请求转换为远程方法调用规范(Remoting)格式;发送单元22用于将远程方法调用规范(Remoting)格式的访问请求发送到.NET服务端;.NET服务端运行访问请求相应的操作后返回运行结果,所述接收单元23用于接收.NET服务端返回的远程方法调用规范(Remoting)格式的运行结果;然后通过解析单元24对远程方法调用规范(Remoting)格式的运行结果进行解析得到返回值;所述返回单元25用于将所述返回值返回给所述客户端。
本发明实施例还提供一种非托管语言与.NET服务端交互系统,如图3所示,该系统包括客户端31、.NET服务端32;在客户端采用非托管语言的情况下,本发明实施例中的交互系统还包括非托管语言与.NET服务端交互装置33。
其中,所述客户端31用于向所述.NET服务端32发起非托管语言访问请求;所述非托管语言与.NET服务端交互装置33用于将所述访问请求转换为远程方法调用规范(Remoting)格式,然后将远程方法调用规范(Remoting)格式的访问请求发送到.NET服务端32;所述.NET服务端32接收到访问请求后运行所述访问请求,并将运行结果反馈给非托管语言与.NET服务端交互装置33;所述非托管语言与.NET服务端交互装置33还用于接收.NET服务端32返回的远程方法调用规范(Remoting)格式的运行结果,然后对远程方法调用规范(Remoting)格式的运行结果进行解析得到返回值,并将所述返回值返回给所述客户端31,非托管语言与.NET服务端交互装置存在于客户端31中。
本发明实施例还提供一种非托管语言与.NET服务端交互装置的生成方法,如图4所示,该方法包括:
401、在制作.NET服务端时,需要编译.NET服务端程序集,并在编译过程中为.NET服务端程序集添加强命名,得到添加强命名的可执行文件,然后将该可执行文件下载到.NET服务端。本过程中需要获取上述可执行文件的远程调用信息,远程调用信息具体包括:公钥标识、命名空间、远程类类名以及多种函数名;
402、为了能够生成所述交互装置,本发明实施例需要根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;
403、然后根据该生成饿非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;
404、并且将预先定义的中转函数加入所述函数定义文件,客户端通过函数定义文件和函数声明文件,就能将访问请求转换为远程方法调用规范(Remoting)格式,并从远程方法调用规范(Remoting)格式的运行结果中解析出返回值,其中最主要的功能在于上述中转函数,该中转函数主要用于:将客户端发起的非托管语言访问请求转换为远程方法调用规范(Remoting)格式,并将远程方法调用规范(Remoting)格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范(Remoting)格式的运行结果,并对远程方法调用规范(Remoting)格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
本发明实施例还提供一种非托管语言与.NET服务端交互装置的生成装置,如图5所示,该生成装置包括:获取单元51、第一生成单元52、第二生成单元53和加入单元54。
其中,获取单元51用于获取被下载到.NET服务端中的可执行文件的远程调用信息;第一生成单元52用于根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;第二生成单元53用于根据第一生成单元52生成额度非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;加入单元54用于将预先定义的中转函数加入所述函数定义文件;所述中转函数用于:将客户端发起的非托管语言访问请求转换为远程方法调用规范(Remoting)格式,并将远程方法调用规范(Remoting)格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范(Remoting)格式的运行结果,并对远程方法调用规范(Remoting)格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
本发明实施例提供的非托管语言与.NET服务端交互方法、装置、系统及生成方法和装置,通过提取.NET服务端中可执行文件的远程调用信息,生成非托管语言的函数声明文件和函数定义文件,并在函数定义文件中写入中转函数。中转函数主要用来将客户端发起的非托管语言访问请求转换为远程方法调用规范(Remoting)格式,并将远程方法调用规范(Remoting)格式的访问请求发送到.NET服务端;中转函数在接收.NET服务端返回的远程方法调用规范(Remoting)格式的运行结果后,对远程方法调用规范(Remoting)格式的运行结果进行解析得到返回值,并将所述返回值返回给所述客户端。
在非托管语言需要访问.NET服务端时,需要将上述函数声明文件和函数定义文件写入非托管语言的工程,以便在运行非托管语言程序时能够通过中转函数的功能调用.NET服务端服务,使得非托管语言能够与.NET服务端进行交互实现远程调用,解决了非托管语言程序调用.NET服务端服务存在局限性的问题。
实施例2:
下面结合一个具体的例子描述本发明非托管语言与.NET服务端进行通信的过程,以及进行通信所需要装置的制作过程和具体使用方法。本实施例中的.NET服务端为.NET服务端卡,非托管语言为C语言;在实际运用时,可以采用.NET服务端服务器作为.NET服务端,采用其他非托管语言,本实施例并不做限定。
如图6所示,具体过程包括;
601、在制作.NET服务端卡时,需要编译.NET服务端程序集,并在编译过程中为.NET服务端程序集添加强命名,得到添加强命名的可执行文件。
通常,可执行文件中包含有:标准的可执行文件信息、代码和元数据表等,其中,标准的可执行文件信息是指可执行文件中标准的PE(PortableExecutable)文件头和无用区块表,该PE(Portable Executable)文件头可以用来识别当前文件为可执行文件,无用区块表是指存储.NET服务端卡不支持的资源的区块表,该资源如Windows的窗体、图标等等;元数据表中包含有各种数据,包括:类、参数和函数等等。
其中,强命名用于防止可执行文件被篡改和版本控制,在编译的过程中由编译器提供,添加强命名后主机生成密钥对,包括一个公钥、一个私钥,然后由主机对程序集进行特定算法的Hash运算,得到该程序集的文件散列值,使用私钥对该文件散列值进行加密得到密文,该Hash值的密文及公钥存储于可执行文件的清单中,并且私钥不可见。强命名程序集包含文件名、版本号、语言文化信息及公钥标识。添加强命名的过程主要包括:
1、获取强命名实用工具SN.exe,其中,SN.exe为微软2005自带工具;
2、编写命令SN-k MyServer.exe,并将该命令告知实用工具SN.exe;
3、创建MyServer.exe文件,其中创建MyServer.exe文件的过程中生成一对以二进制格式存储的公钥和私钥;
4、将System.Reflection.AssemblyKeyFileAttribute特性应用到MyServer.exe程序集;
5、通过编译器进行编译,当编译器在源代码中遇到所述特性时,将打开其中制定的文件MyServer.exe,用私钥对程序集签名,并将公钥嵌入清单中。添加强命名的可执行文件一个具体实例如图7所示。
其中,上述为程序集添加强命名的第3步中得到公钥,由于第3步得到的公钥占用空间较多,本发明实施例中故对公钥进行HASH运算,得到该公钥的散列值即公钥标识(publickeytoken)。本实施例中即为,HASH(公钥)=公钥标识,并且在公钥标识需要使用时才计算得到,不进行预先计算存储。
上述为程序集添加强命名的实现过程以及各文件名,具体见本实施例如下程序集:
程序:MyServer.cs
Namespace MyNameSpace
{
    Class MyServer{
       Public int MySample(int a,int b)
      {
           Return a+b;
}
}
}
602、将编译并添加强命名后得到的可执行文件下载到.NET服务端卡;如上面的举例所示,将原程序MyServer.cs编译后得到的可执行文件MyServer.exe下载到.NET服务端卡中,其中可执行文件清单中存储有公钥及私钥签名后的程序MyServer.cs的散列值。
通过上述601和602过程,已经完成了.NET服务端卡的制作,但是为了使得采用C语言等非托管语言的客户端能够与.NET服务端卡进行通信,本发明实施例还需要生成非托管语言与.NET服务端卡的交互装置,具体的生成过程见后续步骤。
603、获取上述可执行文件的远程调用信息,可执行文件远程调用信息具体包括:公钥标识、命名空间、远程类类名、函数名;
程序在编译后得到的可执行文件元数据表中包含完整的命名空间、类名、函数名等信息,如本实施例图7举例所示,程序MyServer.cs编译后得到的可执行文件的元数据表中包含完整的命名空间MyNameSpace、类名MyServer及函数名MySample,又本实施例中,程序MyServer.cs编译后得到的可执行文件添加了强命名,并对添加强命名后生成的公钥进行HASH运算得到公钥标识,则可以获取的本实施例中可执行文件的远程调用信息:公钥标识、命名空间、远程类类名、函数名具体为:publickeytoken、MyNameSpace、MyServer、MySample。
由上述可知.NET服务端程序被编译后,所有远程调用信息存放于元数据表中。其中元数据表在原有的PE文件格式的基础上扩展而来,由一个新的数据目录存放,该数据目录称为IMAGE_COR_HEADER。则在获取公钥标识、命名空间和类名、函数名时需要打开文件做映射,然后分析PE格式找到IMAGE_COR_HEADER目录偏移;具体代码如下:
PBYTE pFile;
IMAGE_DOS_HEADER*pDos=pFile;
IMAGE_NT_HEADERS*pNtHeader=ImageGetNTHeader(pDos);
IMAGE_COR20_HEADER*pCorHeader=ImageGetCorHeader(pNtHeader);
获取#Strings流的偏移:
PBYTE pMetas=NULL;
PBYTE pStrings=NULL;
IMAGE_COR_STREAM_HEADER*pStream;
进行Rva地址到Raw地址的转换
pMetas=pDos+RvaToRaw(pCorHeader->MetaData.VirtualAddress);
pStream=ImageStreamHeader(“#Strings”);
pStrings=pMetas+pStream->iOffset;
下面举一个例子说明获取可执行文件中公钥标识、命名空间和类名、函数名的过程;在元数据表中获取远程调用信息需要从所述可执行文件的数据流中获取远程调用信息每个数据的偏移地址和数据体长度,然后根据偏移地址和数据体长度分别读取远程调用信息的每个数据。具体的执行过程包括:
1、获取数据流中其中一个数据的偏移地址、数据体长度;
2、根据上述偏移地址及数据体长度获取第一位数据;
3、获取下一个数据的偏移地址、数据体长度,
4、根据偏移地址、数据体长度获取下一位数据。
上述获取数据的过程是一个循环的过程,直到获取所需的全部数据才完成。
假设在#Blob流中存放公钥标识的字符串,在#Strings中存放命名空间、类名、函数名的字符串;其获取元数据表中存储偏移列的值的实现代码如下:
PBYTE pAssemName=NULL;
DWORD dwCol=0;
获取元数据表中程序集名称;
dwCol=GetRowCol(0x20/*Metatable_Assembly*/,5/*Assembly.Name*/);
pAssemName=pStrings+dwCol;
获取类名和命名空间的方法,与上雷同
PBYTE pPkToken=NULL;
PBYTE pNameSpace=NULL;
PBYTE pMethodName=NULL;
……………..
604、根据步骤601中得到的公钥标识(publickeytoken)、命名空间MyNameSpace、类名MyServer生成C语言中函数声明文件(.H文件);其中,生成的.H文件具体为定义宏、定义函数如本实施例举例所示,以代码实现如下:
用上述获取远程调用信息,构建.H文件
HANDLE hFile=NULL;
hFile=CreateFile(pAssemName,CREATE_FILE,…);
1、写头文件引用定义
BYTE szTemp[250]={0};
/*#include<windows.h>*/
WriteFile(hFile,”#include<windows.h>”);
/*#define ASSEMBLY“MYSERVER”*/
Wsprintf(szTemp,”#define ASSEMBLY“%s””,pAssemName);
WriteFile(hFile,szTemp);
…………..
/*#define METHODNAME“MySample”*/
Wsprintf(szTemp,”#define METHODNAME“%s””,pMethodName);
WriteFile(hFile,szTemp);
2、写入函数声明
/*int MySample(int a,int b);*/
Wsprintf(szTemp,”int%s(int a,int b);”,pMethodName);
WriteFile(hFile,szTemp);
生成的.H文件如下:
#include<windows.h>
#define ASSEMBLY“MYSERVER”
#define PKTOKEN“123456789”
#define NAMESPACE“MyNameSpace.MyServer”
#define METHODNAME“MySample”
int MySample(int a,int b);
上述.H文件由.NET服务端卡开发商提供,与.NET服务端卡一起发送给.NET服务端卡用户。
605、根据步骤604中生成函数定义文件中定义的函数名生成C语言程序函数定义文件(.C文件),并在其中加入中转函数Trans,建立.NET服务端卡与调用.NET服务端卡的程序之间的通道;其中,生成的函数定义文件(.C文件)具体即为生成函数,以代码实现如下:
#include“myfile.h”
 int MySample(int a,int b)
{
Int params[2]={a,b};
Int ret;
Return ret;
}
实际应用中,C语言程序还可以被其他非托管语言程序代替,只是由于C语言比较常用,本实施例以C语言程序为例。
上述的中转函数主要用于:将客户端发起的非托管语言访问请求转换为Remoting(远程方法调用规范)格式,并将Remoting格式的访问请求发送到.NET服务端;接收.NET服务端返回的Remoting格式的运行结果,并对Remoting格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
具体而言中转函数Trans需要将访问请求中的访问参数打包,并缓存为Remoting格式,这里的访问参数主要包括公钥标识Publickeytoken、命名空间、类名、函数名、参数和返回值的地址等;打包之后通过Remoting格式将参数发送至.NET服务端卡,.NET服务端卡对接收到访问请求中的参数进行运行,并返回运行结果,所述中转函数还需要接收.NET服务端卡通过Remoting格式返回的运行结果,并解析Remoting格式的运行结果,从中取出返回值,然后将返回值发送给客户端。当然,一般情况下在进行打包之前还需要对客户端进行身份验证,在身份验证通过后才进行后续操作,以保证能够本次访问时安全的。
中转函数具体由.NET服务端卡开发商提供,大体格式如下:
Trans(............)
 {
     Pack(ASSEMBLY,PKTOKEN,NAMESPACE,METHODNAME,params);
     Buffer(Remoting格式);
     Send(.NET服务端Card);
     接收Buffer
     Remoting  解析;
        Ret;
     }
将中转函数写入函数定义文件中,生成的函数定义文件(.C)文件具体代码如下:
#include“myfile.h”
 int MySample(int a,int b)
{
Int params[2]={a,b};
Int ret;
Trans(ASSEMBLY,PKTOKEN,NAMESPACE,METHODNAME,params,&ret);
Return ret;
}
上述.C文件由.NET服务端卡开发商提供,与.NET服务端卡一起发送给.NET服务端卡用户。
606、上述603至605的过程中完成了非托管语言与.NET服务端卡交互装置的制作过程,.NET服务端卡用户如果通过非托管语言的客户端进行访问时,需要下载上述.H和.C文件,并将.H文件和.C文件加入需要调用.NET服务端卡的C语言程序的工程中;
具体地,是在.NET服务端卡开发商将.H文件、.C文件及.NET服务端卡一同发送给.NET服务端卡用户后,由.NET服务端卡用户在需要调用.NET服务端卡时,将其接收到的.H文件、.C文件写入其需要调用.NET服务端卡的C语言工程中,以便实现.NET服务端卡的应用。
607、运行C语言程序调用.NET服务端卡。
采用上述方案后,通过C语言调用.NET服务端卡的具体过程如下:
运行C语言程序前,首先通过可执行文件清单中存储的公钥,验证该清单中存储的私钥签名后的可执行文件的Hash值,验证通过后运行该C语言程序。当运行到调用.NET服务端卡处时,将访问请求中的访问参数打包,并缓存为Remoting格式,这里的访问参数主要包括公钥标识Publickeytoken、命名空间、类名、函数名、参数和返回值的地址等;打包之后通过Remoting格式将参数发送至.NET服务端卡,.NET服务端卡对接收到访问请求中的参数进行运行,并返回运行结果,所述中转函数还需要接收.NET服务端卡通过Remoting格式返回的运行结果,并解析Remoting格式的运行结果,从中取出返回值,然后将返回值发送给客户端,返回客户端的过程可以是将返回值赋予.NET服务端地址中,然后由MySample返回。上述具体实现过程的代码实现如下:
代码实现Remoting打包:
Remoting_Serialize(CHAR*szAssem,
CHAR*pkToken,
CHAR*szNameSpace,
CHAR*szName,
VOID*Params)
{
  BYTE pBuff[1024]={0};
构造Remoting Header:
  Remoting_Serialize_Header(pBuff,
szAssem,
pkToken,
szNameSpace,
szName);
构造参数Object:
  Remoting_Serialize_Object(pBuff,Params);
}
Remoting的解包:
Remoting_Serialize(PBYTE pBuff,VOID*Params,VOID*Ret)
{
返回值的参数个数:
  DWORD dwParams=0;
  解析Remoting Header:
  Remoting_Deserialize_Header(pBuff,& dwParams);
解析返回值的参数,和返回值:
  Remoting_Serialize_Object(pBuff,Params,dwParams,Ret);
}
本发明实施例提供的非托管语言与.NET服务端交互方法、装置、系统及生成方法和装置,通过提取.NET服务端中可执行文件的远程调用信息,生成非托管语言的函数声明文件和函数定义文件,并在函数定义文件中写入中转函数。中转函数主要用来将客户端发起的非托管语言访问请求转换为Remoting格式,并将Remoting格式的访问请求发送到.NET服务端;中转函数在接收.NET服务端返回的Remoting格式的运行结果后,对Remoting格式的运行结果进行解析得到返回值,并将所述返回值返回给所述客户端。
在非托管语言需要访问.NET服务端时,需要将上述函数声明文件和函数定义文件写入非托管语言的工程,以便在运行非托管语言程序时能够,能够通过中转函数的功能调用.NET服务端的服务,使得非托管语言能够与.NET服务端进行交互实现远程调用,解决了非托管语言程序调用.NET服务端的服务存在局限性的问题。
实施例3:
本发明实施例还提供一种非托管语言与.NET服务端交互装置,如图8所示,该交互装置包括:验证单元81、转换单元82、发送单元83、接收单元84、解析单元85、返回单元86。
其中,验证单元81用于对所述客户端进行身份验证,具体而言就是通过可执行文件清单中存储的公钥,验证该清单中存储的私钥签名后的可执行文件的Hash值;所述转换单元82在客户端通过身份验证之后,将客户端发起的非托管语言访问请求转换为Remoting(远程方法调用规范)格式;然后通过发送单元83将Remoting格式的访问请求发送到.NET服务端;.NET服务端运行访问请求相应的操作后返回运行结果,所述接收单元84用于接收.NET服务端返回的Remoting格式的运行结果;然后通过解析单元85对Remoting格式的运行结果进行解析得到返回值;所述返回单元86用于将所述返回值返回给所述客户端。
本发明实施例还提供一种非托管语言与.NET服务端交互系统,如图9所示,该系统包括客户端91、.NET服务端92;为了保证非托管语言的客户端能够与.NET服务端通信,本发明实施例中还包括非托管语言与.NET服务端交互装置93;一般来讲,本实施例中.NET服务端可以为.NET服务端卡或者.NET服务端服务器。
其中,所述客户端91用于向所述.NET服务端92发起非托管语言访问请求,为了能够访问.NET服务端92,本发明实施例中的客户端需要在该访问请求所在文件引用所述交互装置对应的函数定义文件和函数声明文件。为了保证客户端是合法访问,本发明实施例中非托管语言与.NET服务端交互装置93还用于对所述客户端91进行身份验证,具体实现可以通过可执行文件清单中存储的公钥,验证该清单中存储的私钥签名后的可执行文件的Hash值。
所述非托管语言与.NET服务端交互装置93还用于在上述验证通过后,将所述访问请求转换为Remoting格式,然后将Remoting格式的访问请求发送到.NET服务端92;所述.NET服务端92接收到访问请求后运行所述访问请求,并将运行结果反馈给非托管语言与.NET服务端交互装置93;所述非托管语言与.NET服务端交互装置93还用于接收.NET服务端92返回的Remoting格式的运行结果,然后对Remoting格式的运行结果进行解析得到返回值,并将所述返回值返回给所述客户端91。
本发明实施例还提供一种非托管语言与.NET服务端交互装置的生成装置,如图10所示,该生成装置包括:获取单元11、第一生成单元12、第二生成单元13和加入单元14。
其中,获取单元11用于获取被下载到.NET服务端中的可执行文件的远程调用信息;第一生成单元12用于根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;第二生成单元13用于根据第一生成单元12生成的非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;加入单元14用于将预先定义的中转函数加入所述函数定义文件;所述中转函数用于:将客户端发起的非托管语言访问请求转换为Remoting格式,并将Remoting格式的访问请求发送到.NET服务端;接收.NET服务端返回的Remoting格式的运行结果,并对Remoting格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
上述获取单元11具体实现方式如下,该获取单元11包括:获取模块111和读取模块112。
其中,获取模块111用于从所述可执行文件的数据流中获取远程调用信息每个数据的偏移地址和数据体长度;读取模块112用于根据偏移地址和数据体长度分别读取远程调用信息的每个数据。
本发明实施例主要用在各种采用非托管语言的客户端中,用来通过该客户端顺利访问.NET服务端。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (14)

1、一种非托管语言与.NET服务端交互方法,其特征在于,包括:
将客户端发起的非托管语言访问请求转换为远程方法调用规范格式;
将远程方法调用规范格式的访问请求发送到.NET服务端;
接收.NET服务端返回的远程方法调用规范格式的运行结果;
对远程方法调用规范格式的运行结果进行解析得到返回值;
将所述返回值返回给所述客户端。
2、根据权利要求1所述的非托管语言与.NET服务端交互方法,其特征在于,所述访问请求中包括访问参数。
3、根据权利要求1所述的非托管语言与.NET服务端交互方法,其特征在于,在将客户端发起的非托管语言访问请求转换为远程方法调用规范格式之前,该方法还包括:
对所述客户端进行身份验证;
所述将客户端发起的非托管语言访问请求转换为远程方法调用规范格式为:在所述客户端通过身份验证之后,将客户端发起的非托管语言访问请求转换为远程方法调用规范格式。
4、一种非托管语言与.NET服务端交互装置,其特征在于,包括:
转换单元,用于将客户端发起的非托管语言访问请求转换为远程方法调用规范格式;
发送单元,用于将远程方法调用规范格式的访问请求发送到.NET服务端;
接收单元,用于接收.NET服务端返回的远程方法调用规范格式的运行结果;
解析单元,用于对远程方法调用规范格式的运行结果进行解析得到返回值;
返回单元,用于将所述返回值返回给所述客户端。
5、根据权利要求4所述的非托管语言与.NET服务端交互装置,其特征在于,还包括:验证单元,用于对所述客户端进行身份验证;
所述转换单元在客户端通过身份验证之后,将客户端发起的非托管语言访问请求转换为远程方法调用规范格式。
6、一种非托管语言与.NET服务端交互系统,包括客户端、.NET服务端;其特征在于,还包括非托管语言与.NET服务端交互装置;
所述客户端用于向所述.NET服务端发起非托管语言访问请求;
所述非托管语言与.NET服务端交互装置用于将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;
所述.NET服务端用于运行所述访问请求;
所述非托管语言与.NET服务端交互装置还用于接收.NET服务端返回的远程方法调用规范格式的运行结果;对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
7、根据权利要求6所述的非托管语言与.NET服务端交互系统,其特征在于,所述非托管语言与.NET服务端交互装置还用于对所述客户端进行身份验证。
8、根据权利要求6所述的非托管语言与.NET服务端交互系统,其特征在于,所述非托管语言访问请求所在文件引用了所述交互装置对应的函数定义文件和函数声明文件。
9、根据权利要求6、7或8所述的非托管语言与.NET服务端交互系统,其特征在于,所述.NET服务端为.NET服务端卡或者.NET服务端服务器。
10、一种非托管语言与.NET服务端交互装置的生成方法,其特征在于,包括:
获取被下载到.NET服务端中的可执行文件的远程调用信息;
根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;
根据生成的所述非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;
将预先定义的中转函数加入所述函数定义文件;
所述中转函数用于:将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范格式的运行结果,并对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
11、根据权利要求10所述的非托管语言与.NET服务端交互装置的生成方法,其特征在于,所述非托管语言访问请求所在文件引用了所述函数定义文件和函数声明文件。
12、根据权利要求10所述的非托管语言与.NET服务端交互装置的生成方法,其特征在于,所述获取被下载到.NET服务端中的可执行文件的远程调用信息包括:
从所述可执行文件的数据流中获取远程调用信息每个数据的偏移地址和数据体长度;
根据偏移地址和数据体长度分别读取远程调用信息的每个数据。
13、一种非托管语言与.NET服务端交互装置的生成装置,其特征在于,包括:
获取单元,用于获取被下载到.NET服务端中的可执行文件的远程调用信息;
第一生成单元,用于根据所述远程调用信息中的公钥标识、命名空间和远程类类名生成非托管语言对应的函数声明文件;
第二生成单元,用于根据所述第一生成单元生成的非托管语言对应的函数声明文件中的函数名生成非托管语言对应的函数定义文件;
加入单元,用于将预先定义的中转函数加入所述函数定义文件;
所述中转函数:用于将客户端发起的非托管语言访问请求转换为远程方法调用规范格式,并将远程方法调用规范格式的访问请求发送到.NET服务端;接收.NET服务端返回的远程方法调用规范格式的运行结果,并对远程方法调用规范格式的运行结果进行解析得到返回值;将所述返回值返回给所述客户端。
14、根据权利要求13所述的非托管语言与.NET服务端交互装置的生成装置,其特征在于,所述获取单元包括:
获取模块,用于从所述可执行文件的数据流中获取远程调用信息每个数据的偏移地址和数据体长度;
读取模块,用于根据偏移地址和数据体长度分别读取远程调用信息的每个数据。
CN2009102355163A 2009-09-29 2009-09-29 非托管语言与.net服务端交互及其生成方法、装置、系统 Expired - Fee Related CN101674333B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009102355163A CN101674333B (zh) 2009-09-29 2009-09-29 非托管语言与.net服务端交互及其生成方法、装置、系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009102355163A CN101674333B (zh) 2009-09-29 2009-09-29 非托管语言与.net服务端交互及其生成方法、装置、系统

Publications (2)

Publication Number Publication Date
CN101674333A true CN101674333A (zh) 2010-03-17
CN101674333B CN101674333B (zh) 2012-08-08

Family

ID=42021317

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009102355163A Expired - Fee Related CN101674333B (zh) 2009-09-29 2009-09-29 非托管语言与.net服务端交互及其生成方法、装置、系统

Country Status (1)

Country Link
CN (1) CN101674333B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112199219A (zh) * 2020-11-17 2021-01-08 南开大学 一种跨语言作业远程调用方法
CN113645303A (zh) * 2021-08-11 2021-11-12 曙光信息产业(北京)有限公司 数据传输方法、装置、计算机设备及存储介质

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1553318A (zh) * 2003-05-30 2004-12-08 汤晓辉 一种通用的工业联网及远程管理装置及方法
CN1921426B (zh) * 2005-08-26 2010-05-05 乐金电子(昆山)电脑有限公司 UPnP媒体服务器中的P2P服务器应用设备及应用方法

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112199219A (zh) * 2020-11-17 2021-01-08 南开大学 一种跨语言作业远程调用方法
CN113645303A (zh) * 2021-08-11 2021-11-12 曙光信息产业(北京)有限公司 数据传输方法、装置、计算机设备及存储介质
CN113645303B (zh) * 2021-08-11 2024-04-23 曙光信息产业(北京)有限公司 数据传输方法、装置、计算机设备及存储介质

Also Published As

Publication number Publication date
CN101674333B (zh) 2012-08-08

Similar Documents

Publication Publication Date Title
CN110096338B (zh) 智能合约执行方法、装置、设备及介质
US12008386B2 (en) Conservative class preloading for real time java execution
RU2405202C2 (ru) Использование абстрактных описаний для генерации, обмена и конфигурирования рабочих циклов сервиса и клиента
US8589522B2 (en) Incrementally updatable system software infrastructure for sensor networks
US6385661B1 (en) System and method for dynamic generation of remote proxies
EP3491527B1 (en) Debugging tool for a jit compiler
US20040158577A1 (en) System and method for cross platform and configuration build system
JP2005149495A (ja) 非プラットフォーム固有の一意の識別子の生成
CN102779244B (zh) 一种文件操作的执行方法及装置
MX2015002906A (es) Generacion de codigo nativo a partir de un codigo de lenguaje intermediario para una aplicacion.
US8910190B2 (en) Analytics data collection with low integration cost for dynamic message passing systems
CN111913741B (zh) 对象拦截方法、装置、介质及电子设备
CN101674333B (zh) 非托管语言与.net服务端交互及其生成方法、装置、系统
CN112269602A (zh) 一种WebAssembly加载方法、装置及存储介质
US20040267914A1 (en) Method, apparatus and system for creating efficient UPnP control points
US9672014B2 (en) Transparent network substrate system
US20090083708A1 (en) Method and system for aspect scoping in a modularity runtime
CN115328679A (zh) 异构函数库的自动化集成方法、计算设备及其系统
CN114398102A (zh) 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
US8001523B1 (en) System and methods for implementing an explicit interface member in a computer programming language
Keogh et al. OOP demystified
Lin et al. A style for integrating MS‐Windows software applications to client–server systems using Java technology
Beuche et al. JPURE—A Purified Java Execution Environment for Controller Networks
Wirjawan et al. Balancing computation and code distribution costs: The case for hybrid execution in sensor networks
US10346225B2 (en) Synthesized modules for module renaming

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20120808