C# 中 System.String[*] 和 System.String[] 的区别

gun*_*sus 6 c# vb.net com

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

\n
\n

我正在使用 COM 库开发一个应用程序。由于64位会出现问题,所以我的目标CPU是x86。

\n

所有方法都按预期工作,除了GetOPCServers().

\n

尽管使用相同 dll 的 Visual Basic 代码不会导致问题,但 C# 会抛出System.InvalidCastException以下错误:

\n
\n

System.Core.dll 中发生了类型为“System.InvalidCastException”的第一次机会异常

\n

附加信息:
\n\'System.String[*]\' t\xc3\xbcr\xc3\xbcndeki nesne \'System.String[]\' t\xc3\xbcr\xc3\xbcne at\xc4\xb1lamad\xc4 \xb1.

\n
\n

由于我的操作系统是土耳其语,因此对错误消息表示歉意。

\n
\n

type 中的对象System.String[*]不能赋值System.String[]

\n
\n

System.String[*]和 和有什么区别System.String[]

\n

使用相同dll的VB代码运行没有异常

\n
Public Class OpcInfo\n  Dim servers As VariantType\n  Dim server As OPCAutomation.OPCServer = New OPCAutomation.OPCServer()\n\n  Function GetServers()\n    Dim servers As Object\n    Dim _servers As New List(Of String)\n\n    servers = server.GetOPCServers()\n\n    For Each server As String In servers\n      _servers.Add(server)\n    Next\n    Return _servers\n  End Function\nEnd Class\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
static void Main(string[] args)\n{\n    var opc_servers = new OPCAutomation.OPCServer().GetOPCServers();\n    foreach (var item in (string[])opc_servers)\n    {\n        Console.WriteLine(item);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

更有趣的是,我可以在“观察/立即”窗口中查看数据:

\n

观察窗

\n

错误代码-2147467262对应FFFFFFFF80004002并根据https://technet.microsoft.com/en-us/library/bb632794.aspx进行解释

\n
E_NOINTERFACE \nFFFFFFFF80004002\n-2147467262\nNo such interface supported\n
Run Code Online (Sandbox Code Playgroud)\n

gun*_*sus 2

感谢大家。

在循环内部进行转换并不能解决问题。

正如 @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));
}
Run Code Online (Sandbox Code Playgroud)