5

次のシグネチャを持つ C# 関数があります。

int Get1251Bytes(string source, byte[] result, Int32 lengthOfResult)

C++ から呼び出します。コンパイラから、2 番目のパラメーターにはSAFEARRAY*型が必要であると通知されました。だから私はそれをこのように呼びます:

SAFEARRAY* safeArray = SafeArrayCreateVector(VT_UI1, 0, arrayLength);
char str[] = {'s', 't', 'a', 'c', 'k', '\0'};
converter->Get1251Bytes(str, safeArray, arrayLength);

しかし、safeArray は更新されず、まだ zores が含まれています。しかしGet1251Bytes、C# 単体テストで機能をテストしました。result正常に動作し、配列を更新します。私は何を間違っていますか?

4

2 に答える 2

3

あなたの問題は、Blittable および Non-Blittable 型( Byteis blittable ) に関連しています。

最適化として、blittable メンバーのみを含む blittable 型およびクラスの配列は、マーシャリング中にコピーされる代わりに固定されます。これらの型は、呼び出し元と呼び出し先が同じアパートメントにある場合、In/Out パラメーターとしてマーシャリングされているように見えることがあります。ただし、これらの型は実際には In パラメーターとしてマーシャリングされるため、引数を In/Out パラメーターとしてマーシャリングする場合は、InAttribute および OutAttribute 属性を適用する必要があります。

コードを修正するには、C# コード[Out]のパラメーターに属性を適用する必要があります。result

int Get1251Bytes(string source, [Out] byte[] result, Int32 lengthOfResult)

また、渡す必要はありませんlengthOfResult。.NET では、Lengthプロパティを使用して配列のサイズを取得できます。

于 2012-12-20T12:12:31.127 に答える
-1

配列であっても、reforを使用する必要がありoutます。そして、使用する必要がありますout

int Get1251Bytes(string source, out byte[] result, Int32 lengthOfResult)
{
    ...
}

outref lokk の詳細については、リンクを参照してください。

そして、配列に関する記事はこちら

于 2012-12-20T10:00:02.083 に答える