我有一个动态方法调用一个COM对象。当我尝试返回结果为byte []时,我得到以下例外:.NET字节数组COM对象问题
System.InvalidCastException:无法强制类型为'System.Byte [*]'
任何帮助,将不胜感激。
我有一个动态方法调用一个COM对象。当我尝试返回结果为byte []时,我得到以下例外:.NET字节数组COM对象问题
System.InvalidCastException:无法强制类型为'System.Byte [*]'
任何帮助,将不胜感激。
您的情况下的COM对象方法似乎返回一个非零下限数组。你可以创建一个普通的字节数组,然后将数据从第一阵列复制这样的:
var comArray = (Array)(object)comObject.CallToComObject();
byte[] data = new byte[comArray.Length];
Array.Copy(comArray, data, data.Length);
我不知道是否有办法避免复制。
编辑:
对于未知给我一个原因,如果非零下限阵列以动态的方式返回,即,CallToComObject
签名具有dynamic
返回值的类型,则异常如果我们只是试图将其转换为Array
,将会抛出。将它投射到object
首先似乎解决了这个问题。我不知道为什么。
上面的第2行失败,前面报告了相同的例外情况。我没有var comArray,我有动态comArray。 – c0D3l0g1c
@ c0D3l0g1c,我更新了答案,尝试将返回值转换为'object',然后转换为'Array'。 –
感谢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 []数组的形式检索文档。这个COM组件是一个黑匣子。无法访问源代码。有没有办法来解决这个问题? – c0D3l0g1c