Использование размера управляемой структуры в C#

#c# #unmanaged #managed #sizeof

#c# #неуправляемый #управляемый #sizeof

Вопрос:

Я пытаюсь перенести код C на C #. Код предназначен для регистрации класса window с помощью RegisterClassEx .

В коде C есть объект WNDCLASSEX wcex . Объект wcex имеет свойство

 wcex.cbSize = sizeof(WNDCLASSEX);
  

В C # я определил структуру как

     [StructLayout(LayoutKind.Sequential)]
    public struct WNDCLASSEX
    {
        public uint cbSize;
        public uint style;
        [MarshalAs(UnmanagedType.FunctionPtr)]
        public PlatformInvokeGDI32.WNDPROC lpfnWndProc;
        public int cbClsExtra;
        public int cbWndExtra;
        public IntPtr hInstance;
        public IntPtr hIcon;
        public IntPtr hCursor;
        public IntPtr hbrBackground;
        public string lpszMenuName;
        public string lpszClassName;
        public IntPtr hIconSm;
    }
  

Я попытался получить размер, используя

 wcex.cbSize = (uint)sizeof(WNDCLASSEX);
  

Функция, содержащая этот параметр, объявляется как

 unsafe private void
  

Я надеялся unsafe , что это заставит statment работать. Однако я получаю эту ошибку в среде IDE:

Cannot take the address of, get the size of, or declare a pointer to a managed type ('CaptureScreen.PlatformInvokeGDI32.WNDCLASSEX')

Могу ли я превратить структуру в неуправляемую структуру? Если да, то как? Есть ли способ использовать sizeof, не делая структуру неуправляемой? Существует ли .NET-версия sizeof, которая будет работать?

Комментарии:

1. Просто чтобы быть уверенным.. вы знаете, что использование Win32 API для создания окон может быть выполнено в миллион раз проще с помощью Windows Forms, эквивалента C # / .NET?

2. Я делаю. Мой проект просто должен помочь мне узнать о Win32 API.

Ответ №1:

Используйте Marshal.SizeOf вместо этого.

Комментарии:

1. Спасибо. В итоге я использовал wcex.cbSize = (uint)Marshal.SizeOf(typeof(PlatformInvokeUSER32.WNDCLASSEX));

2.Со временем все меняется, и теперь MS рекомендует общую форму этого метода, например (uint)Marshal.SizeOf<Win32.WNDCLASSEX>(); learn.microsoft.com/en-us/dotnet/api /…