簡體   English   中英

從C#將字節引用傳遞給非托管CPP COM dll

[英]Passing byte reference to unmanaged cpp COM dll from c#

有人可以幫我嗎。 我正在使用在我的C#項目(非托管C ++ DLL)中注冊為COM對象的C ++ DLL。 我在C ++ dll中調用一個函數,該函數需要BYTE *作為參數之一(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/zh-CN/25ac7d0d-6fca-48e2-a022-bcc29d0a2908/can-you-tell-me-why- safearray接口方法定義如此重要 該論壇上的最后一篇文章提供了一個示例,該示例說明了如何在不更改DLL項目的情況下更改il(但是我遇到了相同的問題,盡管我沒有使用proxy / stub dll)。 然后,我嘗試從存根/代理dll生成Interop DLL,並修改該il,但它給了我內存不足的異常。 我還嘗試將CPP DLL項目中的Byte *聲明為SAFEARRAY(BYTE),但它給了我一個語法錯誤。

但是由於命運的緣故,它會取消所有dll的注冊,清理等操作。我回到了原始DLL,現在我一直在繼續獲取內存不足異常。 xD真是太有趣了...會讓您發布消息

您的com objects方法使用指向byte的指針,但是您傳遞的只是字節的第一項(nativeByte [0]),這是錯誤的,請像這樣調用該方法

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

還您在智能感知中看到了在鍵入feg.SendPacket時該方法期望的參數是什么,這將幫助您確定是否為參數添加ref關鍵字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM