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直接注册么(调用机方嫌麻烦不想装)?
...全文
6586 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#专家
内容概要:本文介绍了如何利用 GitHub Copilot 辅助进行程序调试与 Bug 分析,强调 Copilot 不仅可用于代码生成,更是强大的代码分析与调试工具。文章详细阐述了 Copilot 在调试复杂问题、老旧项目维护和难以复现 Bug 场景下的优势,提出了“先分析、再修改”的四步流程:分析原因→评估风险→提出方案→修改代码,并推荐结合错误日志、用户操作等信息精准提问,提升 AI 回答质量。同时展示了如何通过 Copilot 增强调试能力,如自动加日志、异常保护、生成测试数据和性能分析。最后通过游戏拾取系统的实际案例,说明如何结构化描述问题以获得有效反馈。; 适合人群:具备一定开发经验,正在参与项目调试或维护工作的程序员,尤其是面对复杂逻辑、历史代码或难复现 Bug 的 1-3 年开发者;也适合希望提升 AI 协作能力的技术人员。; 使用场景及目标:①快速定位偶发性崩溃、数据异常等问题根源;②理解无文档或结构混乱的老代码模块;③优化调试流程,借助 AI 生成诊断建议、修复方案与测试用例;④构建更具健壮性的程序,提前发现潜在缺陷。; 阅读建议:学习者应结合自身项目中的真实问题,按照文中提供的结构化提问模板实践,逐步训练与 Copilot 的协作能力,重视问题描述的完整性与准确性,避免直接要求修改代码,优先通过分析提升对系统的理解。
内容概要:本文针对高精度电流控制下的永磁同步电机(PMSM)参数辨识难题,提出一种基于粒子群优化算法(PSO)的多参数辨识模型,并在Simulink环境中完成系统级仿真实现。研究旨在克服传统控制中因电机参数(如定子电阻、交直轴电感、永磁磁链等)随温度、负载变化而失配所导致的电流控制性能下降问题。通过构建以电流跟踪误差为核心的适应度函数,利用PSO算法全局寻优能力强的特点,实现对关键电机参数的在线或离线精确辨识。文中详述了PSO算法的实现机制、参数初始化策略、收敛判据设计以及与PMSM矢量控制系统的集成方法,验证了该方案在不同运行工况下的辨识精度、收敛速度与鲁棒性,显著提升了电流环的动态响应品质与稳态控制精度。; 适合人群:具备电机驱动控制、现代控制理论及优化算法基础,熟悉MATLAB/Simulink仿真平台,从事高性能PMSM控制系统研发的研究生、高校科研人员及自动化、电力电子领域的工程师;特别适合正在开展参数自适应、智能控制算法应用等相关课题的研究者。; 使用场景及目标:①应用于高端制造装备、电动汽车驱动系统、精密伺服系统等对电流控制精度要求严苛的场合;②解决实际工程中因电机温升、老化等因素引发的参数漂移问题,提升系统长期运行稳定性;③作为智能优化算法与电机控制深度融合的教学案例,帮助理解PSO在复杂非线性系统参数辨识中的应用逻辑与实现路径。; 阅读建议:建议读者结合提供的Simulink仿真模型进行复现实验,重点剖析PSO算法模块与电机控制模型的接口设计、适应度函数的构建原则及参数敏感性分析方法,可进一步尝试引入其他先进优化算法(如GWO、HHO)进行性能对比,以深入掌握不同智能算法在工程辨识问题中的适用性与优劣。

663

社区成员

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

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