PB9怎么调用VS2010写的C#dll

lawuniandji 2015-07-20 05:15:16
现在利用VS和c#写了个测试类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PB_test
{
public class Class1
{
public static string test(string fydh, string fydscsj)
{
string result = "";
int fyd_retrun = 0;
string message = "调用测试开始";
result = "0";
if (fydh == "0")
{
message = "请传入正确的号码";
}
else
{
if (int.TryParse(fydh.ToString(), out fyd_retrun))
{
message = "成功获取号码:" + fyd_retrun;
string strings = fydh + " " + fydscsj;
result = "1";
}
else
{
message = "传入的号码格式有误:" + fydh;
result = "0";
}
}
return message +";当前状态:" +result;
}
}
}


现在想请问下,生成dll后,在开发机上还需要对dll进行什么操作么?
然后我想让调用机上的PB9成功调用C#的dll需要在调用机进行什么操作,如注册、PB调用代码?
以及想确认下,PB9调用C#写的dll必须要通过RegAsm.exe来注册下么,调用机上没有.net,可以不安装.net直接注册么(调用机方嫌麻烦不想装)?
...全文
6430 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jonwh 2017-06-17
  • 打赏
  • 举报
回复
引用 7 楼 lawuniandji 的回复:
[quote=引用 5 楼 xiajinxian 的回复:] 参考地址 :http://download.csdn.net/detail/xiajinxian/7043565 另外可以用regasm.exe注册的
现在我自己下了个PB来测调用,返回消息是提示一个-3的状态,网上查了下是说无法创建新实例?我不确定是不是我注册的方式不对还是什么? 大神求指导[/quote] 将DLL文件拷贝到其他电脑上面 提示注册成功了 但是PB还是不能调用 返回消息提示 -3 状态 ???请问怎么解决呀
zhanglei555555 2016-05-26
  • 打赏
  • 举报
回复
谢谢 正好在研究这个 已经实验成功 主要是调用麻烦,开发工具不同,c#的代码不用的写法,一点一点去试,很麻烦
lawuniandji 2015-07-24
  • 打赏
  • 举报
回复
已经解决了!!PB9成功调用了
把C#和PB代码分享一下
一、C#中
1.Class1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; //该引用必须

namespace PB_tests
{
[Guid("8C4FAF54-1484-4C86-B734-1B6441C4892E")] //利用GUID生成器随机生成,大家上网查如何生成,必须
public interface CallParamers
{
[DispId(1)]
string PBCAll(string hm, DateTime fssj, ref int result);

}

[Guid("44490EDD-582C-4618-9831-81C2237C7759")] //利用GUID生成器随机生成,大家上网查如何生成,必须
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : CallParamers
{
public string PBCAll(string hm, DateTime fssj, ref int result)
{
int hm_retrun = 0;
string message = "调用测试开始";
result = 0;
if (hm == "0")
{
message = "请传入正确的号码";
}
else
{
if (int.TryParse(hm.ToString(), out hm_retrun))
{
message = "成功获取号码:" + hm_retrun;

string strings = hm+ " " + fssj;

result = 1;
}
else
{
message = "传入的号码格式有误:" + hm;
result = 0;
}
}
return message;
}

}
}


2.AssemblyInfo.cs(自动生成,只需注意[assembly: ComVisible(true)]是否为true)
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("PB_tests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("PB_tests")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(true)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("cc9871a2-2d46-47b7-ac9b-2069036050fe")]

// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

3.属性设置


4.生成
生成时一定要用管理员权限运行VS


二、注册你自己的DLL
1.DLL路径拷贝
"C:\Users\XXXX(你自己的用户名)\Desktop\PBCallCCOM\CCOM_PB_tests\PB_tests\bin\Debug\PB_tests.dll"
2.利用RegAsm.exe注册PB_tests.dl(可从其他机器拷贝至本地注册,测试时版本应该无限制2.0,4.0应该都可以)
管理员权限打开CMD,命令格式(①计算机自带RegAsm时执行;②本地无RegAsm.exe,从其他机器拷贝至本地后执行,路径需自行更改)
① RegAsm PB_tests.dll
② C:\Users\XXXX(你自己的用户名)\Desktop\PBCallCCOM\PB_tests_dll\net2.0\RegAsm.exe C:\Users\XXXX(你自己的用户名)\Desktop\PBCallCCOM\CCOM_PB_tests\PB_tests\bin\Debug\PB_tests.dll
显示注册成功即可行(路径中不能有中文,我之前注册成功后PB仍不能调用,提示-3,后更换英文路径后即成功调用)


三、PB中调用
1.PBwindows——pbcall
中代码

string messages
string fydh
date fysj
int returns
int flag

fydh ='aaaa'
fysj =today()
returns =0

OleObject Oleb
Oleb = Create OLEObject
flag = Oleb.ConnectToNewObject("PB_tests.Class1") //PB_tests为C#中命名空间(namespace) ,Class1为C#中类名

if flag <>0 then
MessageBox("提示","PB调用C#COM组件失败,返回消息")
return
end if

messages =Oleb.PBCall(fydh ,fysj ,ref returns)
MessageBox("提示",messages)


2.Application——pbcall_test
open(pbcall)


3.双击windows,ctrl+R运行

A啦Dbit 2015-07-22
  • 打赏
  • 举报
回复
参考地址 :http://download.csdn.net/detail/xiajinxian/7043565 另外可以用regasm.exe注册的
lawuniandji 2015-07-22
  • 打赏
  • 举报
回复
引用 5 楼 xiajinxian 的回复:
参考地址 :http://download.csdn.net/detail/xiajinxian/7043565 另外可以用regasm.exe注册的
现在我自己下了个PB来测调用,返回消息是提示一个-3的状态,网上查了下是说无法创建新实例?我不确定是不是我注册的方式不对还是什么? 大神求指导
lawuniandji 2015-07-22
  • 打赏
  • 举报
回复
引用 4 楼 lzp_lrp 的回复:
你提出的c#的问题,应该到.net版块提问,呵呵,非c#专家
好的~~谢谢啦,测试dll我用C#调用可以成功执行,应该是可行的 现在我自己下了个PB来测调用,返回消息是提示一个-3的状态,网上查了下是说无法创建新实例?我不确定是不是我注册的方式不对还是什么? 大神求指导
lawuniandji 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 lzp_lrp 的回复:
参考一下这个

Delphi7程序调用C#写的DLL解决办法 (2009-02-09 23:12:16)
近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题。在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:
编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目TestDll,
using System.Runtime.InteropServices;
namespace TestDll
{
public interface ITestClass
{
void YourProcedure(stirng param1);
}
[ClassInterface(ClassInterfaceType.None)]
public classTestClass:ITestClass
{
public void YourProcedure(stirng param1);
{ //自己的代码 }
}
}
完成之后,设置项目的属性“Make assembly COM-Visible”为选中状态。编译之后得到 TestClass.dll,把此dll放到Delphi主程序目录下。打开vs2005自带的工具“Visual Studio 2005命令提示”,输入
Regasm 路径\TestClass.dll 向系统注册此dll。

Delphi程序调用此Dll方式有两种:
一、打开vs2005自带的工具“Visual Studio 2005命令提示”,输入 TlbExp 路径\TestClass.dll 得到一个TestClass.tlb 文件。打开Delphi,选择“Project”--“import type library”找到刚才的TestClass.tlb,点击 CreateUnit,向delphi中引入一个com接口。
delphi 调用代码如下:
var aClass:TestClass;
begin
aClass := CoTestClass.Create;
aClass.YourProcedure('参数');
end;
二、不需生成tlb文件,仿照调用Excel的方式。代码如下:
var aClass: Variant;
begin
aClass:= CreateOleObject('TestDll.TestClass');
aClass.YourProcedure('参数');
end;

以上两种方法都可以调用成功,其中调用regasm.exe向系统注册dll是必需的。第一种方法需要生成tlb文件,并引入delphi中,操作繁琐,但可以看到接口的定义。第二种方法操作简单,但看不到接口的定义。




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PB_test
{
public interface ITestClass
{
static string test(string fydh, string fydscsj);
}

[ClassInterface(ClassInterfaceType.None)]
public class Class1:ITestClass
{
public static string test(string fydh, string fydscsj)
{
string result = "";
int fyd_retrun = 0;
string message = "调用测试开始";
result = "0";
if (fydh == "0")
{
message = "请传入正确的号码";
}
else
{
if (int.TryParse(fydh.ToString(), out fyd_retrun))
{
message = "成功获取号码:" + fyd_retrun;

string strings = fydh + " " + fydscsj;
result = "1";
}
else
{
message = "传入的号码格式有误:" + fydh;
result = "0";
}
}
return message +";当前状态:" +result;
}
}
}



是像上面这样吗?

2.属性里“为COM互助操作注册”勾选对吧?如下图


3.对方没有VS,我能将我的regasm.exe拷贝给对方,再用regasm.exe来注册吗?
lawuniandji 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 lzp_lrp 的回复:
参考一下这个 Delphi7程序调用C#写的DLL解决办法 (2009-02-09 23:12:16) 近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题。在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行: 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目TestDll, using System.Runtime.InteropServices; namespace TestDll { public interface ITestClass { void YourProcedure(stirng param1); } [ClassInterface(ClassInterfaceType.None)] public classTestClass:ITestClass { public void YourProcedure(stirng param1); { //自己的代码 } } } 完成之后,设置项目的属性“Make assembly COM-Visible”为选中状态。编译之后得到 TestClass.dll,把此dll放到Delphi主程序目录下。打开vs2005自带的工具“Visual Studio 2005命令提示”,输入 Regasm 路径\TestClass.dll 向系统注册此dll。 Delphi程序调用此Dll方式有两种: 一、打开vs2005自带的工具“Visual Studio 2005命令提示”,输入 TlbExp 路径\TestClass.dll 得到一个TestClass.tlb 文件。打开Delphi,选择“Project”--“import type library”找到刚才的TestClass.tlb,点击 CreateUnit,向delphi中引入一个com接口。 delphi 调用代码如下: var aClass:TestClass; begin aClass := CoTestClass.Create; aClass.YourProcedure('参数'); end; 二、不需生成tlb文件,仿照调用Excel的方式。代码如下: var aClass: Variant; begin aClass:= CreateOleObject('TestDll.TestClass'); aClass.YourProcedure('参数'); end; 以上两种方法都可以调用成功,其中调用regasm.exe向系统注册dll是必需的。第一种方法需要生成tlb文件,并引入delphi中,操作繁琐,但可以看到接口的定义。第二种方法操作简单,但看不到接口的定义。
请问 public interface ITestClass { void YourProcedure(stirng param1); } [ClassInterface(ClassInterfaceType.None)] 这几句 是必须的吗?
WorldMobile 2015-07-21
  • 打赏
  • 举报
回复
参考一下这个 Delphi7程序调用C#写的DLL解决办法 (2009-02-09 23:12:16) 近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题。在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行: 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目TestDll, using System.Runtime.InteropServices; namespace TestDll { public interface ITestClass { void YourProcedure(stirng param1); } [ClassInterface(ClassInterfaceType.None)] public classTestClass:ITestClass { public void YourProcedure(stirng param1); { //自己的代码 } } } 完成之后,设置项目的属性“Make assembly COM-Visible”为选中状态。编译之后得到 TestClass.dll,把此dll放到Delphi主程序目录下。打开vs2005自带的工具“Visual Studio 2005命令提示”,输入 Regasm 路径\TestClass.dll 向系统注册此dll。 Delphi程序调用此Dll方式有两种: 一、打开vs2005自带的工具“Visual Studio 2005命令提示”,输入 TlbExp 路径\TestClass.dll 得到一个TestClass.tlb 文件。打开Delphi,选择“Project”--“import type library”找到刚才的TestClass.tlb,点击 CreateUnit,向delphi中引入一个com接口。 delphi 调用代码如下: var aClass:TestClass; begin aClass := CoTestClass.Create; aClass.YourProcedure('参数'); end; 二、不需生成tlb文件,仿照调用Excel的方式。代码如下: var aClass: Variant; begin aClass:= CreateOleObject('TestDll.TestClass'); aClass.YourProcedure('参数'); end; 以上两种方法都可以调用成功,其中调用regasm.exe向系统注册dll是必需的。第一种方法需要生成tlb文件,并引入delphi中,操作繁琐,但可以看到接口的定义。第二种方法操作简单,但看不到接口的定义。
WorldMobile 2015-07-21
  • 打赏
  • 举报
回复
你提出的c#的问题,应该到.net版块提问,呵呵,非c#专家

662

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder Web 应用
社区管理员
  • Web 应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧