如何從C#中調用以下方法,該方法位於C++ dll中?我如何在C#中重新創建以下結構?如何從C#代碼調用非託管dll中的函數?
原始
方法:
LONG MyMethod (P_HOLO_INFO pInfo, LPVOID pBuffer, LPUSHORT pTracksWritten);
結構:該方法使用以下結構:
typedef struct _HOLO_INFO
{
LONG lHoloType;
LONG lStatus;
HANDLE lThreadHandle;
LONG lErrorCode;
LONG lDriveIndex;
LONG lHeight;
SHORT iFormat;
INT iStartingTrack;
LONG lWrite;
LONG lSkip;
BOOL bSkipZero;
BOOL bInvert;
LONG lMaxConsecutiveErrors;
LONG lMaxTotalErrors;
LONG lMostConsecutiveErrors;
LONG lTotalErrors;
LPBYTE pBuffer;
LPUSHORT pTracksWritten;
LONG bUpsideDown;
} HOLO_INFO, *P_HOLO_INFO;
我曾在C#這樣
方法:
[DllImport("My.dll", EntryPoint = "[email protected]")]
public unsafe static extern long MyMethod(ref HOLO_INFO pInfo, Byte[] pBuffer,ref ushort pTracksWritten);
結構:
該方法使用以下結構:
unsafe public struct HOLO_INFO
{
public long lHoloType;
public long lStatus;
public long lThreadHandle;
public ulong lErrorCode;
public long lDriveIndex;
public long lHeight;
public short iFormat;
public int iStartingTrack;
public long lWrite;
public long lSkip;
public bool bSkipZero;
public bool bInvert;
public long lMaxConsecutiveErrors;
public long lMaxTotalErrors;
public long lMostConsecutiveErrors;
public long lTotalErrors;
public Byte* pBuffer;
public long* pTracksWritten;
public long bUpsideDown;
};
我進行的呼叫以這樣的方法:
do
{
result = MyMethod(ref pInfo,ptrBuf,pTracksWritten);
} while (result ==1);
因爲,它返回1,如果是有源 0,如果它成功完成 3,如果因爲錯誤而停止。如果方法處於運行狀態(Active-1),則爲 。它修改pInfo和pTracksWritten更新狀態信息。
我不得不做類似的事情。我所做的就是將DLL包裝在CLRC++類中,並在一側獲得C++結構,並在另一側返回CLR兼容結構,但是這是一段時間後,現在可能有更好的方法。 – 2011-04-03 14:55:22
你在這裏顯然是正確的。如果我是你,我會用C++編寫一個特殊的測試函數來消除細節。讓它將輸入寫入文件。然後您可以檢查您從C#發送的內容是否正確。對於任何其他方向的數據傳遞,請讓測試C#程序也登錄到文件。 – 2011-04-03 16:27:31