2016-08-05 3 views
2

私はCOMオブジェクトへの動的メソッド呼び出しを持っています。.NET Byte Array COMキャストの問題

System.InvalidCastExceptionの::型のオブジェクトをキャストできません「System.Byte [*]」「System.Byte []は」を入力するために、私は[]バイトとして結果を返すしようとすると、私は次の例外を取得します

ご協力いただければ幸いです。

+1

。 COMオブジェクトは何をしていますか? –

+0

これは、ストレージプロバイダからbyte []配列としてドキュメントを取得しています。このCOMコンポーネントはブラックボックスです。ソースへのアクセス権がありません。これを修正する方法はありますか? – c0D3l0g1c

答えて

1

あなたの場合のCOMオブジェクトメソッドは、ゼロ以外の下限の配列を返しているようです。あなたは、通常のバイト配列を作成し、このような最初の配列からデータをコピーすることができます

var comArray = (Array)(object)comObject.CallToComObject(); 

byte[] data = new byte[comArray.Length]; 

Array.Copy(comArray, data, data.Length); 

私はコピーを回避する方法があるかどうかわかりません。その後、非ゼロの下限配列は動的な方法で返された場合、私には未知の理由のため

、すなわち、CallToComObjectの署名がdynamic戻り値の型を持っている、例外:

EDIT Arrayとしてキャストしようとするとスローされます。最初にobjectにキャスティングすると、この問題が解決するようです。どうしてか分かりません。

+0

上記の2行目で失敗しました。以前に報告されたのと同じ例外があります。私はvar comArrayを持っていない、私は動的comArrayを持っています。 – c0D3l0g1c

+0

@ c0D3l0g1c、答えを更新し、戻り値を 'object'にキャストしてから' Array'にキャストしようとしました。 –

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