1

誰かが私を助けてくれませんか。C# プロジェクト (アンマネージド c++ dll) で COM オブジェクトとして登録されている C++ dll を使用しています。パラメータの 1 つとして BYTE* を必要とする C++ dll の関数を呼び出しています (BYTE* は char* として定義された型です)。

DLL の説明には、次のように記載されています。

[id(4),helpstring("Send packet via channel")] HRESULT  SendPacket([in] struct FEG_UNIQUE_ID *Destination, [in,ref,size_is(MaxBytes),length_is(MaxBytes)] BYTE *Data, [in] LONG MaxBytes, [out,retval] VARIANT_BOOL *Result);

関数を呼び出す C# コードは、次のことを行います。

public Boolean SendPacket(UInt64 destID, Byte[] data)
    {
        Byte [] temp = new Scrambler().scramble(data); //Scramble data to be sent

        byte[] nativeByte = new byte[temp.Length]; //Convert to native byte type

        for (int i = 0; i < temp.Length; i++)
            nativeByte[i] = (byte)temp[i]; 

        FEGClientModule.FEG_UNIQUE_ID UIdestID = new FEGClientModule.FEG_UNIQUE_ID();

        UIDHelper.SetIDLongLong(unchecked(destID), out UIdestID);

        bool result = feg.SendPacket(ref UIdestID, ref nativeByte[0], nativeByte.Length);

        return result;
    }

私が抱えている問題は、byte[] (nativeByte) が参照として渡されますが、受信した配列の最初のバイトのみが正しいことです (ネットワーク経由で送信されているデータを確認するには、wireshark を使用する必要がありました)。受信クライアントはパケットを無視するだけです:(送信される残りのバイトは毎回異なります。

オブジェクトブラウザは、関数が「refバイト」を渡すことを望んでいることを示しています.DLLは他の多くのcppプロジェクトで問題なく使用されているため、何が間違っているのかわかりません。どんなアドバイスでも大歓迎です:)

アップデート:

こんにちはハンス、助けてくれてありがとう、SAFEARRAY宣言を読みました。この投稿を試しました (最後の解決策を参照) http://social.msdn.microsoft.com/Forums/vstudio/en-US/25ac7d0d-6fca-48e2-a022-bcc29d0a2908/can-you-tell-me-why- safearray-so-important-in-interface-method-definition . そのフォーラムの最後の投稿では、DLL プロジェクトを変更せずに il を変更する方法の例を示しています (ただし、プロキシ/スタブ dll は使用していませんが、同じ問題に遭遇しました)。次に、スタブ/プロキシ dll から Interop DLL を生成し、それを変更しようとしましたが、メモリ不足の例外が発生しました。また、CPP DLL プロジェクトで Byte* を SAFEARRAY(BYTE) として宣言しようとしましたが、構文エラーが発生します。

しかし、運命として、すべてのdllの登録解除、クリーニングなどを行います。元のDLLに戻りましたが、今ではメモリ不足の例外が発生し続けています。とても楽しい xD ...投稿し続けます。

4

1 に答える 1