.NET 字节数组 COM 转换问题
.NET Byte Array COM casting issue
我有一个对 COM 对象的动态方法调用。当我尝试将结果作为 byte[] 返回时,出现以下异常:
System.InvalidCastException: Unable to cast object of type 'System.Byte[*]' to type 'System.Byte[]'
如有任何帮助,我们将不胜感激。
您的 COM 对象方法似乎 return 一个非零下限数组。您可以创建一个普通字节数组,然后像这样从第一个数组复制数据:
var comArray = (Array)(object)comObject.CallToComObject();
byte[] data = new byte[comArray.Length];
Array.Copy(comArray, data, data.Length);
我不确定是否有避免复制的方法。
编辑:
出于我不知道的原因,如果非零下限数组以动态方式 returned,即 CallToComObject
的签名具有 dynamic
return 值类型,那么如果我们简单地尝试将其转换为 Array
就会抛出异常。首先将其转换为 object
似乎可以解决问题。不知道为什么。
感谢 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);
我有一个对 COM 对象的动态方法调用。当我尝试将结果作为 byte[] 返回时,出现以下异常:
System.InvalidCastException: Unable to cast object of type 'System.Byte[*]' to type 'System.Byte[]'
如有任何帮助,我们将不胜感激。
您的 COM 对象方法似乎 return 一个非零下限数组。您可以创建一个普通字节数组,然后像这样从第一个数组复制数据:
var comArray = (Array)(object)comObject.CallToComObject();
byte[] data = new byte[comArray.Length];
Array.Copy(comArray, data, data.Length);
我不确定是否有避免复制的方法。
编辑:
出于我不知道的原因,如果非零下限数组以动态方式 returned,即 CallToComObject
的签名具有 dynamic
return 值类型,那么如果我们简单地尝试将其转换为 Array
就会抛出异常。首先将其转换为 object
似乎可以解决问题。不知道为什么。
感谢 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);