簡體   English   中英

C#導入C Dll。 struct中的數組指針。 如何?

[英]C# import C Dll. Array pointer in struct. How to?

我需要你的幫助。

我正在嘗試將C Dll導入C#項目。 這樣做時,我需要在兩個方向的Dll和C#項目之間傳遞一個結構。

這是C的定義:

struct mwBITMAP 
{
 int bmWidth;
 int bmHeight;
 BYTE* bmData;
}; 

這是C#定義:

   [StructLayout(LayoutKind.Sequential)] 
    public struct MwRemoteBmp
    {
        public int Width;
        public int Height;
        public byte[] Data;
    }

我試圖通過引用將C#的結構(數據已正確初始化)傳遞給dll的測試函數。 寬度和高度都正確。 但是數據全錯了。

我在哪里犯錯?

是的,該陣列被封為SAFEARRAY。 不撞掉pinvoke編組員是很不尋常的。 將Data成員聲明為IntPtr,然后使用Marshal.Copy()復制數據。

注意,這在C語言中也很難使用。 存在內存管理問題,尚不清楚誰擁有該陣列。 最典型的是,C函數將使用malloc()分配數組。 這是一個大問題,您無法在C#中釋放該數組,無法調用free()。 您將發生無法插拔的內存泄漏。 如果您不能重寫C代碼,則需要用C ++ / CLI語言編寫包裝器,以便可以調用free()。 如果C dll不使用與C ++ / CLI代碼相同的CRT,則即使這很棘手。 您必須使用/ MD選項編譯C代碼。

使用IntPtr類型而不是byte []類型。 在您的示例中:

[StructLayout(LayoutKind.Sequential)] 
public struct MwRemoteBmp
{
    public int Width;
    public int Height;
    public IntPtr Data;
}

暫無
暫無

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

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