System.String [*]和System.String [] C#

时间:2016-05-05 08:54:32

标签: c# vb.net com

编辑:我知道For Each server As String In servers的C#等价物是foreach(var item in servers),但由于GetOPCServers返回了对象,因此应将其转换为可迭代类型。

我正在使用COM库开发应用程序。由于64位导致问题,我的目标CPU x86。

GetOPCServers()外,所有方法都按预期工作。

虽然使用相同dll的Visual Basic代码不会导致问题,但C#抛出System.InvalidCastException说:

A first chance exception of type 'System.InvalidCastException' 
occurred in System.Core.dll

Additional information: 
'System.String[*]' türündeki nesne 'System.String[]' türüne atılamadı.

为我的土耳其语操作系统提供错误消息道歉。

  

System.String[*]类型中的对象无法分配System.String[]

System.String[*]System.String[]之间的差异是什么?

使用相同dll的VB代码无异常地运行

Public Class OpcInfo
  Dim servers As VariantType
  Dim server As OPCAutomation.OPCServer = New OPCAutomation.OPCServer()


  Function GetServers()
    Dim servers As Object
    Dim _servers As New List(Of String)

    servers = server.GetOPCServers()

    For Each server As String In servers
      _servers.Add(server)
    Next
    Return _servers
  End Function
End Class

但是C#代码也使用相同的dll抛出异常

static void Main(string[] args)
{
    var opc_servers = new OPCAutomation.OPCServer().GetOPCServers();
    foreach (var item in (string[])opc_servers)
    {
        Console.WriteLine(item);
    }
}

更有趣的是,我能够在Watch / Immediate窗口中查看数据:

watch window

错误代码-2147467262对应FFFFFFFF80004002,说明符合https://technet.microsoft.com/en-us/library/bb632794.aspx

E_NOINTERFACE 
FFFFFFFF80004002
-2147467262
No such interface supported

1 个答案:

答案 0 :(得分:1)

谢谢大家。

在循环中投射并不成功。

正如@pikoh所说,MS Word Automation in C#上的答案提出了诀窍:

var opc_servers = ...也没有用。必须是object opc_servers = ...

object opc_servers = new OPCAutomation.OPCServer().GetOPCServers();
var servers = ((Array)(opc_servers));


for (int i = 1; i <= servers.Length; i++)
{
    Console.WriteLine((string)servers.GetValue(i));
}