我有一個與結構聲明有關的問題,我結合使用Windows函數WindowFromPoint
和GetCursorPos
。當結構具有int
字段時,代碼分析報告錯誤:CA1901:PInvokeDeclarationsShouldBePortable(CA1901 P/Invoke聲明應該是可移植的,因爲它在你的代碼中聲明,所以P/Invoke NativeMethods.WindowFromPoint(NativeMethods.POINTAPI)
的參數'point' )當我將字段類型更改爲Int16
時,不會返回錯誤,但函數GetCursorPos
停止工作。如何聲明POINT結構以擺脫代碼分析錯誤?
我在Windows 8.1 x64上運行應用程序。是的功能和結構的特徵如下:
[DllImport("user32.dll")]
internal static extern IntPtr WindowFromPoint(POINTAPI point);
[StructLayout(LayoutKind.Sequential)]
public struct POINTAPI
{
internal int x;
internal int y;
}
[DllImport("user32.dll")]
internal static extern int GetCursorPos(out POINTAPI lpPoint);
下面是什麼我試圖做一個總結:
- X和Y聲明爲
int
(如上) - - 應用程序正常工作,代碼分析顯示錯誤。 - X和y聲明爲
Int16
---調用函數GetCursorPos
時,應用程序崩潰,代碼分析不會返回錯誤。 - X和y聲明爲
Int32
---應用程序正常工作,代碼分析顯示錯誤。 - X和y聲明爲
Int64
---函數WindowFromPoint
返回意外結果,代碼分析顯示錯誤。
有沒有人知道如何讓應用程序工作,而沒有代碼分析錯誤(目前已被壓制)?
如果您明確地將結構成員編組爲「UnmanagedType.I4」,分析警告是否會消失? – theB
[文檔](https://msdn.microsoft.com/en-us/library/ms182284.aspx)說_Breaking - 如果P/Invoke在程序集外部可見。不中斷 - 如果P/Invoke在程序集外部是不可見的。那麼你可以使'POINTAPI'內部還是私人? – juharr
@juharr由於'x'和'y'都是'internal',我懷疑答案是肯定的。 – Luaan