编辑:我知道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窗口中查看数据:
错误代码-2147467262
对应FFFFFFFF80004002
,说明符合https://technet.microsoft.com/en-us/library/bb632794.aspx
E_NOINTERFACE
FFFFFFFF80004002
-2147467262
No such interface supported
答案 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));
}