イメージを表す byte[] プロパティを持つ COM dll を C# で作成しようとしています。アイデアは、同僚がカメラとのインターフェイスに私の dll を使用する C++ アプリケーションを作成しているということです。
私の dll は、彼のプログラムがカメラに接続することを正常に許可し、さまざまな値を返しますが、作成された SAFEARRAY は読み取れないようです (彼はその長さの数値を取得しますが、実際のデータを読み取ることはできません)。
以下に示す方法で画像をバイト配列として渡そうとするのは愚かなことですか?
Visual Studio が独自に選択できるようにするのではなく、特定のマーシャリング タイプを使用するよう明示的に指示する必要がありますか?
バイト配列へのポインターも公開する必要がありますか、それとも SAFEARRAY 構造体がこれを処理しますか。
C# を使用してまだ数か月しか経っていませんが、COM dll を作成するのはこれが初めてです。別の C# テスト アプリケーションでイメージを正常に再構築できるため、質問 1 は問題にならないという前提で作業してきました。
クラス (抜粋):
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class ResultInfo : IResult
{
public byte[] ImageBytes
{
get
{
MemoryStream ms = new MemoryStream();
this.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] returnBytes = ms.ToArray();
ms.Close();
return returnBytes;
}
}
}
インターフェイス(抜粋):
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IResult
{
[DispId(5)]
byte[] ImageBytes { get; }
}
編集:これは、C++ 側からの出力です。
HRESULT hr = SafeArrayAccessData (image, &data) を使用して SAFEARRAY にアクセスしようとすると、返される hr は E_UNEXPECTED です。SafeArrayAccessData のドキュメントには、これは「セーフ アレイをロックできませんでした」と記載されています。