unsigned char* バッファのプロパティを定義するファイル IPlan.idl で定義された COM インターフェイスがあります。
[
object,
uuid(...),
dual,
helpstring("..."),
pointer_default(unique)
]
interface IPlan : IDispatch
{
...
[id(28), helpstring("method SetByte")
HRESULT SetByte([in] long index, [in] unsigned char buffer);
[id(29), helpstring("method GetByte")
HRESULT GetByte([in] long index, [out, retval] unsigned char * pBuffer);
[id(30), propget, helpstring("property Buffer")]
HRESULT Buffer([out, retval] unsigned char** pBuffer);
[id(30), propput, helpstring("property Buffer")]
HRESULT Buffer([in] unsigned char* newBuffer);
...
}
私の実装クラス MyPlan は C# で定義されています。このクラスは、C++ COM クラスである CProcessor と対話します。CProcessor は、一部のデータを unsigned char* バッファーに計算します。このデータは、CProcessor 内のすべてのデータがそのバッファーに格納されると、MyPlan オブジェクトに読み込まれます。
IPlan のメタデータは、次の関数シグネチャを定義します。
public interface IPlan
{
...
byte GetByte(int index);
void SetByte(int index, byte buffer);
IntPtr get_Buffer();
void set_Buffer(ref byte pBuffer);
...
}
CProcessor から GetByte と SetByte を使用して、MyPlan の byte[] 変数にアクセスして変更できます。byte[] 変数をマーシャリングして get_Buffer() を使用することもできます。
私の質問は、どのように利用できるかです
set_Buffer(ref byte pBuffer)
関数?CProcessor で呼び出すと、pBuffer にはバッファーの最初のバイトのみが含まれます (SetByte(0, data) の呼び出しのように)。ゲッターで行ったのと同じようにセッターをマーシャリングする必要があると思いますが、検索が空になりました。私が試してみました
set_Buffer([MarshalAs(UnmanagedType.LPStr)] ref byte pBuffer);
しかし、それは配列全体を渡すために何もしていないようです。