C# 对framework 4.0中阵列的Com互操作表示的更改?

C# 对framework 4.0中阵列的Com互操作表示的更改?,c#,com,interop,C#,Com,Interop,我正在将一个C#web项目从2.0框架升级到4.0框架,它引用的COM组件似乎有一些问题。在interops的产生过程中,似乎发生了一些我不知道的变化 在不更改任何代码的情况下,我现在遇到了如下错误: cannot convert from 'out string[]' to 'out System.Array' 对于上面的第一个错误,这是原型: [id(3), helpstring("method GetAllWaves")] HRESULT GetAllWaves([out] SAFEAR

我正在将一个C#web项目从2.0框架升级到4.0框架,它引用的COM组件似乎有一些问题。在interops的产生过程中,似乎发生了一些我不知道的变化

在不更改任何代码的情况下,我现在遇到了如下错误:

cannot convert from 'out string[]' to 'out System.Array'
对于上面的第一个错误,这是原型:

[id(3), helpstring("method GetAllWaves")] HRESULT GetAllWaves([out] SAFEARRAY(BSTR)* ppWaves,  [out,retval] ExactaStatus *Status);
下面是使用它的C代码:

string[] arrWaves;

m_BPStatus = m_objTXPBatchPick.GetAllWaves(out arrWaves);

似乎VisualStudio现在正在基于我以前使用的相同COM库生成不同的方法原型,并且它使用System.Array而不是特定类型。对于4.0项目来说,这是一个新的东西吗?或者visual studio中是否有一些设置我遗漏了?

我从来没有发现过。我必须进行以下代码更改:

Array arrWaves;

m_BPStatus = m_objTXPBatchPick.GetAllWaves(out arrWaves);
Session["arrWaves"] = arrWaves.Cast<string>().ToArray();
阵列波;
m_BPStatus=m_objTXPBatchPick.GetAllWaves(out arrWaves);
会话[“arrWaves”]=arrWaves.Cast().ToArray();

上面的关键是将其更改为存储为
.Cast().ToArray()

IDL中的[out]属性非常不寻常,它与脚本语言不兼容。像这样的论点应该被传递。您看到的新行为并非不合理,根本不能保证COM组件将创建与“向量”兼容的数组。字符串[]需要第一个索引为0的一维数组。如果你不能修复IDL,那么你就必须对子弹进行字节运算。谢谢@HansPassant提供的信息。我只是觉得把框架升级到4.0会导致这种情况很奇怪。