.NET字节数组COM转换问题

时间:2016-08-05 22:20:08

标签: c# casting com

我有一个COM对象的动态方法调用。当我尝试将结果作为byte []返回时,我得到以下异常:

  

System.InvalidCastException:无法将类型为'System.Byte [*]'的对象强制转换为'System.Byte []'

任何帮助都将不胜感激。

2 个答案:

答案 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);