我有一个COM对象的动态方法调用。当我尝试将结果作为byte []返回时,我得到以下异常:
System.InvalidCastException:无法将类型为'System.Byte [*]'的对象强制转换为'System.Byte []'
任何帮助都将不胜感激。
答案 0 :(得分:1)
在您的情况下,COM对象方法似乎返回一个非零下界数组。您可以创建一个普通的字节数组,然后从第一个数组中复制数据,如下所示:
var comArray = (Array)(object)comObject.CallToComObject();
byte[] data = new byte[comArray.Length];
Array.Copy(comArray, data, data.Length);
我不确定是否有办法避免复制。
修改强>
由于我不知道的原因,如果以动态方式返回非零下界数组,即CallToComObject
的签名具有dynamic
返回值类型,则异常将如果我们只是尝试将其转换为Array
,则抛出。首先将其转换为object
似乎可以解决问题。我不知道为什么。
答案 1 :(得分:1)
感谢Jon Skeet的提示。
一旦我明白了问题所在,没有多长时间找到解决方案。感谢这篇文章:https://weblog.west-wind.com/posts/2008/Aug/26/Accessing-a-SafeArray-Result-from-a-COM-Call-in-C
固定代码:
object fileData = _imageServerApplication.GetActualFile();
Array fileDataArray = (Array) fileData;
byte[] fileDataBytes = new byte[fileDataArray.Length];
fileDataArray.CopyTo(fileDataBytes, 0);