我有一個動態方法調用一個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