C#加载C++.dll数据集读取相关数据

0 篇文章 0 订阅

调用的基本原理

调用时应注意的两个问题

1基本数据类型的传递问题
2
指针或地址参数传送问题

C#和C++两种语言定义的基本数据类型有一些不同,在调用时必须先搞清楚基本数据类型在不同语言间的传递问题。也就是说C++的定义的数据类型,必须找到c#所对应的基本数据类型。才能获取相应数据集。下图显示了C++基本数据类型对应的c#基本数据类型,但是对于有些基本数据类型,没有直接对应的数据类型,需要一定的处理。


两种常用的调用方法

1、 封装COM组件库

将C/C++的函数封装成COM组件,在c#中调用就比较方便,但是COM组件需要注册,而且多次注册也可能会导致一些问题。

2、可以使用动态链接库

可以使用动态链接库直接调用C/C++函数库,使用起来比较方便,可以动态加载和调试。

注:这里需要说明下COM组件和普通dll的区别

1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册。 
2.Com
组件是微软的一个协议,满足com组件协议的dll文件就是com组件,这种协议为了跨语言、跨平台使用,dll组件需要编译后使用,Com组件注册后即可使用,而dll是动态链接库,是一个可以导出函数的集合。
3.Com
组件可以是exe也可以是dll文件

用动态链接库静态调用C++的.dll文件

   C++中.dll的源代码:

   .h头文件

 

   .cpp源文件

  

   .ref模板定义文件

  

最终生成的dll文件

 

C#中调用c++的dll文件

最终结果:

CreateDll为文件路径和文件名,test01为函数名。后面的其他参数详见msdn文档。该程序实现了c#获取dll程序集的函数计算和获取一个字符串数组。

关于DIIImport其他参数的说明:

用动态链接库动态调用C++的.dll文件

  

这个类是加载动态链接库需要的源程序,也可以写成工厂类。

关于这三个函数的说明:

在C#中动态调用  C++的dll程序集的代码如下:

结果如下:

这里需要说明的是IntPtr这个数据类型:MSDN上给出的解释是用于表示指针或句柄的平台特定类型。因为c++当中的char*无法直接对应c#中的某一类基本数据类型。

C#拿到C++的.dll的类对象和结构体数组

 以上介绍的是用c#来获取c++中的简单的数据类型,对于类对象和结构体数组等比较复杂的数据类型,在C#中没有一一对应的数据类型,获取方式就有些不同,另外要注意的是在c++中数组的内存是连续存放,而c#是不连续的。这时候还要考虑内存分配的问题。

C++中的源代码:

 .h文件:

这里定义了一个C++类,定义一个人的姓名、年龄和身高。

.cpp文件

这里定义一个结构体User,在类初始化的时候给对象辅助,并将数据赋值给结构体。在生成完dll后调用,c#中会报错,显示内存已破坏,后来,经过查找资料,必须要用Marsh指定空间,然后再传递。于是加了[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 32)]

编译以后在c#中的调用的方式如下:

这里需要说明的是要将c++的结构体数据获取出来,必须在c#中也定义相应的结构体,然后通过Intptr句柄将数据映射到c#结构体数组中,通过调用Marshal.PtrToStructure()方法即可将其转化为结构体类型。

结果如下:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ++编写的全面介绍。 opcdaauto.dll是一种使用C++编写的Windows DLL文件,它是OPC自动化核心组件库的一部分。 OPC自动化是指使用微软所定义的基于COM和DCOM的技术,通过程序化方式实现与OPC服务器进行通信的方法。 opcdaauto.dll为其它组件提供了一些基础服务,以便它们可以通过DCOM连接到OPC服务器并获取数据。该DLL文件使得OPC自动化可以更容易地实现数据交换。 当使用opcdaauto.dll库时,C++程序员需要创建一个COM对象并使用现有的OPC服务器连接到其接口。使用该DLL文件,程序员可以直接访问OPC服务器和其数据点,而无需了解服务器和客户端之间的复杂交互过程。 在使用opcdaauto.dll时,C++程序员可以自由选择使用所需的版本,以及根据自身的应用程序需求,进行自定义修改和应用。使用opcdaauto.dll库,C++程序员可以获得高效可靠的通信,轻松实现数据交换,从而为其它应用程序提供更灵活高效的数据获取手段。 总之,opcdaauto.dll作为OPC自动化核心组件库的一部分,是一个强大的DLL文件。使用C++编写的该DLL文件,可以在Windows操作系统上提供高效的通信,为用户带来方便,同时也为C++程序员在应用程序取得成功的基本服务。 ### 回答2: OPC自动化组件opcdaauto.dll是一种用于实现OPC自动化的动态链接库文件。它提供了一组可供开发人员调用和使用的功能接口,以帮助他们开发和实现OPC自动化应用程序。 OPC DA是"数据访问"标准,其允许应用程序从数据读取或写入数据。 OPC DA自动化维护了一些标准接口,可以让应用程序直接调用和使用器COM对象。调用这些接口的最常用方法是使用opcdaauto.dll。 使用opcdaauto.dll,开发人员可以编写各种支持数据访问或数据源和一些常规操作的应用程序。一些应用程序例子包括工业实时控制,监测和其他领域的数据采集和处理。opcdaauto.dll还支持多线程操作和多个客户端同时使用数据源,可以使得许多不同的客户端同时访问数据源。 对于开发人员而言,使用opcdaauto.dll是相对容易的,因为它提供了简便的COM接口。开发人员需要了解如何通过COM接口与OPC DA自动化器进行交互以及如何实现相应的回调方法。对于新手开发者,OPC DA CAB告诉用户如何实现opcdaauto.dll的用户控件,例如可以通过VB脚本或其他编程语言使用。同时,可以找到很多完整的例子,使用它们可以熟悉opcdaauto.dll的基本使用方法。 ### 回答3: OPC(OLE for Process Control)是一种用于工业自动化的标准通信协议。OPC DA(Data Access)是OPC的一种子协议,用于实时数据读取和写入。opcdaauto.dll是一个OPC DA自动化客户端库,可用于连接到OPC服务器并读取数据。 使用C++编程语言可以调用opcdaauto.dll的函数来实现与OPC服务器的通信。首先,需要加载opcdaauto.dll库,然后使用CoInitialize函数初始化COM(Component Object Model)运行时库,以便调用COM接口。接下来,使用CLSIDFromProgID函数获取OPC服务器的CLSID(Class ID),并使用CoCreateInstance函数创建一个与OPC服务器的连接。通过IOPCServer接口,可以查询OPC服务器上的所有标签(Items),并使用IOPCSyncIO接口同步读取或写入标签的值。读取或写入完成后,需要使用CoUninitialize函数关闭COM运行时库并释放与OPC服务器的连接。 除了opcdaauto.dll库,还有许多其他的OPC DA客户端库可供选择,例如opcdaclient.dll、QT OpcUa Client SDK等。选择哪一种库取决于具体应用的需求和开发人员的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值