编辑:我知道 C# 相当于For Each server As String In serversis foreach(var item in servers),但由于GetOPCServers返回对象,因此应该将其转换为可迭代类型。
我正在使用 COM 库开发一个应用程序。由于64位会出现问题,所以我的目标CPU是x86。
\n所有方法都按预期工作,除了GetOPCServers().
尽管使用相同 dll 的 Visual Basic 代码不会导致问题,但 C# 会抛出System.InvalidCastException以下错误:
\n\nSystem.Core.dll 中发生了类型为“System.InvalidCastException”的第一次机会异常
\n附加信息:
\n
\n\'System.String[*]\' t\xc3\xbcr\xc3\xbcndeki nesne \'System.String[]\' t\xc3\xbcr\xc3\xbcne at\xc4\xb1lamad\xc4 \xb1.
由于我的操作系统是土耳其语,因此对错误消息表示歉意。
\n\n\ntype 中的对象
\nSystem.String[*]不能赋值给System.String[]
System.String[*]和 和有什么区别System.String[]?
使用相同dll的VB代码运行没有异常
\nPublic 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\nRun Code Online (Sandbox Code Playgroud)\n但是C#代码也使用相同的dll抛出异常
\nstatic 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}\nRun Code Online (Sandbox Code Playgroud)\n更有趣的是,我可以在“观察/立即”窗口中查看数据:
\n\n错误代码-2147467262对应FFFFFFFF80004002并根据https://technet.microsoft.com/en-us/library/bb632794.aspx进行解释
E_NOINTERFACE \nFFFFFFFF80004002\n-2147467262\nNo such interface supported\nRun Code Online (Sandbox Code Playgroud)\n
感谢大家。
在循环内部进行转换并不能解决问题。
正如 @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)