2010-05-06 70 views
2

這是我的第一篇文章!如何調用以C指針作爲參數的C dll中的函數#

我想使用C#將使用預編譯C庫的Windows窗體程序。它將訪問智能卡並提供輸出。 對於圖書館,我有一個.dll,.lib和.h,沒有來源。在.h文件中定義了幾個結構。 .dll最有趣的功能是指向分配結構的指針作爲參數。我一直稱該.dll裏面的功能是這樣的:例如函數

EID_API int WINAPI EidStartup(int nApiVersion); 

將被稱爲像這樣

[DllImport("CelikApi.dll")]//the name of the .dll 
public static extern int EidStartup(int nApiVersion); 

現在我的問題是,我無法找到同樣的C的指針,其指向在C#中的內存中動態分配的結構,所以我不知道要傳遞給需要C指針的函數的參數。我沒有太多的C#經驗,但對我來說,它的使用看起來是製作我需要的程序最簡單的方法。我嘗試過使用C++,但Visual Studio 2010沒有針對C++/CLR的IntelliSense。如果你能指點我更好的東西,隨時可以這樣做。

回答

1

你可以做這樣的事情

[DllImport("Operations.dll")] 
    public static extern void Operation(
     [MarshalAs(UnmanagedType.LPArray)]ushort[] inData, 
     int inSize1, int inSize2, 
     [MarshalAs(UnmanagedType.LPArray)]int[] outCoords, 
     ref int outCoordsSize); 

該代碼將一個無符號short(在C#USHORT),以及多種尺寸參數(inSize1和inSize2),以及地方導致的動態分配的數組outCoords大小outCoordsSize的數組。

您的C代碼無法分配內存,並期望C#可以很好地處理它; C#應該分配你的C代碼使用的所有內存。在上述情況下,您可以將outCoords數組的大小放在outCoordsSize中,然後將outCoordsSize的值替換爲您實際使用的內存量(不能超過最初分配的內存量,且無異常)。

相關問題