我想馬歇爾是我的家鄉的dll通過CoTaskMemAlloc分配到我的C#應用程序,並想知道一些數據,如果我這樣做的方法就是明顯錯誤或我錯過了方法C#方的一些sublte裝飾。馬歇爾正確的方式UCHAR []從本機DLL在C#中的byte []
目前,我有C++的一面。
extern "C" __declspec(dllexport) bool __stdcall CompressData( unsigned char* pInputData, unsigned int inSize, unsigned char*& pOutputBuffer, unsigned int& uOutputSize)
{ ...
pOutputBuffer = static_cast<unsigned char*>(CoTaskMemAlloc(60000));
uOutputSize = 60000;
而在C#端。
private const string dllName = "TestDll.dll";
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport(dllName)]
public static extern bool CompressData(byte[] inputData, uint inputSize, out byte[] outputData, out uint outputSize);
...
byte[] outputData;
uint outputSize;
bool ret = CompressData(packEntry.uncompressedData, (uint)packEntry.uncompressedData.Length, out outputData, out outputSize);
這裏outputSize爲60000不如預期,但outputData的大小爲1,當我memset的緩衝C++方面,它似乎只跨1個字節複製,所以這是絕對錯誤的,我需要馬歇爾使用IntPtr + outputSize的調用之外的數據,還是有一些sublte我錯過了我已經工作的東西?
謝謝。
當前的行爲是有道理的:因爲有任何跡象表明'outputSize'以任何方式在所有'outputData'相關,所以'outputData'被處理作爲指向單個'unsigned char'的指針。不幸的是,我無法用正確的方式來寫這個,只是對當前行爲的解釋。 – hvd
是的,這確實是有道理的,outputSize是爲了我的測試好處,顯然如果byte []知道它應該是過時的。 :) 不管怎麼說,還是要謝謝你。 – Niksan