【问题标题】:SafeArrayTypeMismatchException: The specified array is not of the expected typeSafeArrayTypeMismatchException:指定的数组不是预期的类型
【发布时间】:2020-02-27 17:03:42
【问题描述】:

我正在尝试从 OPC DA 服务器读取数据。我正在使用方法 SyncRead SyncRead(short Source, int NumItems, ref Array ServerHandles, out Array Values, out Array Errors, out object Qualities, out object TimeStamps); 问题是我不确切知道参数值数组的类型。 我正在这样做

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OPCAutomation;
using EasyModbus;
using System.Threading;
using System.IO;


Array ServerHandles = new Array[ObjOPCGroup.OPCItems.Count];
Array Values = new Array[ObjOPCGroup.OPCItems.Count];
Array Errors = new Array[ObjOPCGroup.OPCItems.Count];
object Qualities = new object();
object TimeStamps = new object();
Array Values = new Array[ObjOPCGroup.OPCItems.Count];

ObjOPCGroup.SyncRead(
   (short)OPCDataSource.OPCDevice,
   ObjOPCGroup.OPCItems.Count,
   ref ServerHandles,
   out Values,
   out Errors,
   out Qualities,
   out TimeStamps
   );

当我启动应用程序时,我收到错误: System.Runtime.InteropServices.SafeArrayTypeMismatchException:指定的数组不是预期的类型

有人可以帮帮我吗?

谢谢

【问题讨论】:

  • 次要注意:您声明Values 两次;是错字吗?
  • 应该是一个 int[] 数组。

标签: c# .net opc-da


【解决方案1】:

new Array[length] 是一个数组数组;您可能想要一个更合适的数组,例如 new int[length] 用于整数数组,或 new string[length] 用于字符串数组。我们不知道这里的 API 是什么,所以我们无法告诉您它们应该是什么。但它们几乎肯定不应该是 Array 的数组。

另外:其中大部分是作为out 参数传递的,所以您可能甚至不需要初始化任何东西,除了ServerHandles。其余的大概都是null?或者只是通过out var 初始化,即

Array serverHandles = new SomeOtherTypeHere[ObjOPCGroup.OPCItems.Count];

ObjOPCGroup.SyncRead(
   (short)OPCDataSource.OPCDevice,
   ObjOPCGroup.OPCItems.Count,
   ref serverHandles,
   out var values,
   out var errors,
   out var qualities,
   out var timeStamps
   );

【讨论】:

  • 我在你写的时候改变了它并声明了Array serverHandles = new long[ObjOPCGroup.OPCItems.Count]; ,因为我在 OPC DA 自动化的一些文档中发现了这个数据类型。错误信息仍然显示。如何检查哪个变量或参数错误?
  • 好的,我将声明更改为 int[] Array ServerHandles = new int[ObjOPCGroup.OPCItems.Count]; 并收到消息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
  • 更改后我收到消息:System. ArgumentException: Value does not fall within the expected range
  • 在不了解相关 API 的情况下,我无法回答,抱歉。坦率地说,P/Invoke 层很难,通常最好由靠近被调用事物的人包裹。
  • 嗨,马克,感谢您的帮助。我找到了最后一个问题的解决方案。我填充了对象ObjOPCGroup.OPCItems.AddItem("Some.Variable", 1),而没有在数组Array ServerHandles = new int[ObjOPCGroup.OPCItems.Count]; 中保存ServerHanle。当此数组没有句柄时,则此错误 System. ArgumentException:显示值不在预期范围内。作为很好的参考,我可以附上链接,如何使用它:stackoverflow.com/questions/30866803/…。现在我可以将问题标记为已解决
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2015-12-31
相关资源
最近更新 更多