[英]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.