慢慢的有很多接口pb都已经无法调用了,还有一些进制计算,位移等pb都无法实现,这时最简单的就是用c#做好,让pb调用。但是pb只能调用最基础的c++开发的标准dll。通过无数次的百度,我找到了一个好的方法,也许您已经知道了。但是我觉得还是要写出来,只要还有一个为此发愁的朋友存在。谢谢!

方法思路是:

1、用c#写一个类,方法的参数一定要用标准数据类型,返回值也要是标准数据类型(string、int或者结构等等)。在这个方法里面调用各类webservice或其他http接口等pb无法直接调用的。

2、我正巧要做一个调用java写的webservice,下面贴出代码,供参考,因为用csc.exe编译程序无法处理引用,所以

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace ysxt
{
public class
ws
{
public string sendrecv(string sUser, string
sPwd)
{
string
retu = "";
try
{
xjca.YsxtMainServiceImplService myrefe = new
xjca.YsxtMainServiceImplService();
//这里就是解决csc.exe无法编译引用问题的,xjca是在另外一个ysws.cs文件里,这个cs文件不是我写的,也不能写出来,这是用另外一个命令生成出来的,具体命令看本文最后备注
myrefe.Url =
myUrl;
retu = myrefe.sendRecv(sUser,
sPwd);
}
catch
(Exception e)
{
return
e.Message;//一定要用
try....catch,否则pb调用过程中出现错误,都没有办法知道哪里错了,这句话就是关键。
}
return
sSign + "\r\n" + retu;
}
}
}

3、关键:将c#程序编译成PB可以调用的COM,为了调试方便,我将编译程序写成了一个bat批处理文件,和.cs程序放在一个目录里面。以下是这个bat文件脚本,很简单的。

c:
cd C:\Program Files\Microsoft
SDKs\Windows\v7.0A\bin
sn.exe -k D:\program\ysxt\ysxt\ysxt.snk
d:
cd D:\program\ysxt\ysxt\
C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /t:library
/keyfile:ysxt.snk /out:ysxt.dll ys*.cs

简单解释一下:我写的c#程序在两个ys开头的.cs文件里面。只要这2个文件,执行这个bat批处理之后,将会在目录下出现snk文件,放着别管他。

4、注册:执行完bat之后,程序目录下会出现一个dll文件,我的就是ysxt.dll。然后再监理一个bat文件,这个文件以后要一起给客户,他们在安装程序的时候都要执行,当你升级这个dll的时候,也要再次执行,因为光覆盖整个dll是不起作用的,要重新注册,注册用的bat文件如下:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe /u
ysxt.dll
C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe
ysxt.dll /tlb:ysxt.tlb /codebase

再简单解释一下,这些exe文件也许在你电脑上的路径和我不同,版本也许不同,但是我喜欢用framwork2.0

或 3.5版本的,这样去客户端无需安装.net framework环境

5、以下就是pb调用已经注册好的dll的方法了

OLEObject ole_1
long ll_status
stringls_ret
//创建OLEObject对象
ole_1 = Create OLEObject
ll_status= ole_1.ConnectToNewObject("ysxt.ws")
//ysxt是我c#代码中的命名空间,ws是c#代码中的类名
if ll_status <> 0
then
messagebox("打开com失败",string(ll_status))
ole_1.DisConnectObject()
return -1
end if
ls_ret =
ole_1.sendrecv("aaa", "bbb"") //这是c#代码中实现接口调用的方法
ole_1.DisConnectObject()
destroy ole_1

6、最后贴出一个遗漏的,就是如何用命令行生成webservice引用的cs文件

c:
cd C:\Program Files\Microsoft
SDKs\Windows\v7.0A\bin\
wsdl.exe /language:c# /n:xjca
/out:D:\HIS1\program\ysxt\ysxt\ysws.cs
http://172.16.186.6/ysxt-wscs/service/mainservice?wsdl

这个很关键,不用这个办法编译不了调用web引用的cs文件

7、最后说个注意事项,pb支持调用的c#方法不能是静态的,就是不能写public

static,只能是public



慢慢的有很多接口pb都已经无法调用了,还有一些进制计算,位移等pb都无法实现,这时最简单的就是用c#做好,让pb调用。但是pb只能调用最基础的c++开发的标准dll。通过无数次的百度,我找到了一个好的方法,也许您已经知道了。但是我觉得还是要写出来,只要还有一个为此发愁的朋友存在。谢谢!

方法思路是:

1、用c#写一个类,方法的参数一定要用标准数据类型,返回值也要是标准数据类型(string、int或者结构等等)。在这个方法里面调用各类webservice或其他http接口等pb无法直接调用的。

2、我正巧要做一个调用java写的webservice,下面贴出代码,供参考,因为用csc.exe编译程序无法处理引用,所以

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace ysxt
{
public class
ws
{
public string sendrecv(string sUser, string
sPwd)
{
string
retu = "";
try
{
xjca.YsxtMainServiceImplService myrefe = new
xjca.YsxtMainServiceImplService();

//这里就是解决csc.exe无法编译引用问题的,xjca是在另外一个ysws.cs文件里,这个cs文件不是我写的,也不能写出来,这是用另外一个命令生成出来的,具体命令看本文最后备注

myrefe.Url =
myUrl;
retu = myrefe.sendRecv(sUser,
sPwd);
}
catch
(Exception e)
{
return
e.Message;//一定要用
try....catch,否则pb调用过程中出现错误,都没有办法知道哪里错了,这句话就是关键。
}
return
sSign + "\r\n" + retu;
}
}
}

3、关键:将c#程序编译成PB可以调用的COM,为了调试方便,我将编译程序写成了一个bat批处理文件,和.cs程序放在一个目录里面。以下是这个bat文件脚本,很简单的。

c:
cd C:\Program Files\Microsoft
SDKs\Windows\v7.0A\bin
sn.exe -k D:\program\ysxt\ysxt\ysxt.snk
d:
cd D:\program\ysxt\ysxt\
C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /t:library
/keyfile:ysxt.snk /out:ysxt.dll ys*.cs

简单解释一下:我写的c#程序在两个ys开头的.cs文件里面。只要这2个文件,执行这个bat批处理之后,将会在目录下出现snk文件,放着别管他。

4、注册:执行完bat之后,程序目录下会出现一个dll文件,我的就是ysxt.dll。然后再监理一个bat文件,这个文件以后要一起给客户,他们在安装程序的时候都要执行,当你升级这个dll的时候,也要再次执行,因为光覆盖整个dll是不起作用的,要重新注册,注册用的bat文件如下:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe /u
ysxt.dll
C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe
ysxt.dll /tlb:ysxt.tlb /codebase

再简单解释一下,这些exe文件也许在你电脑上的路径和我不同,版本也许不同,但是我喜欢用framwork2.0

或 3.5版本的,这样去客户端无需安装.net framework环境

5、以下就是pb调用已经注册好的dll的方法了

OLEObject ole_1
long ll_status
stringls_ret
//创建OLEObject对象
ole_1 = Create OLEObject
ll_status= ole_1.ConnectToNewObject("ysxt.ws")
//ysxt是我c#代码中的命名空间,ws是c#代码中的类名
if ll_status <> 0
then
messagebox("打开com失败",string(ll_status))
ole_1.DisConnectObject()
return -1
end if
ls_ret =
ole_1.sendrecv("aaa", "bbb"") //这是c#代码中实现接口调用的方法
ole_1.DisConnectObject()
destroy ole_1

6、最后贴出一个遗漏的,就是如何用命令行生成webservice引用的cs文件

c:
cd C:\Program Files\Microsoft
SDKs\Windows\v7.0A\bin\
wsdl.exe /language:c# /n:xjca
/out:D:\HIS1\program\ysxt\ysxt\ysws.cs
http://172.16.186.6/ysxt-wscs/service/mainservice?wsdl

这个很关键,不用这个办法编译不了调用web引用的cs文件

7、最后说个注意事项,pb支持调用的c#方法不能是静态的,就是不能写public

static,只能是public