#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 /…