类型不能作为非托管结构封送
Type cannot be marshaled as an unmanaged structure
我正在尝试更改核心项目中的分辨率。
var devmode = default(Devmode);
devmode.DmDeviceName = new string(new char[32]);
devmode.DmFormName = new string(new char[32]);
devmode.Dmsize = (short)Marshal.SizeOf(devmode);
在上述代码的第 3 行,它失败并产生 "cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed" 错误。
任何人都可以提供一些关于我应该如何解决这个问题的见解吗?奇怪的是,在我提取一些不应该影响此代码的其他代码之前,它工作正常。
结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Devmode
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DmFormName;
public string DmDeviceName;
public short Dmsize;
public int DmPelsWidth;
public int DmPelsHeight;
private readonly short dmlogPixels;
private readonly short dmbitsPerPel;
private readonly int dmdisplayFlags;
private readonly int dmdisplayFrequency;
private readonly int dmiCMMethod;
private readonly int dmiCMIntent;
private readonly int dmmediaType;
private readonly int dmditherType;
private readonly int dmreserved1;
private readonly int dmreserved2;
private readonly int dmpanningWidth;
private readonly int dmpanningHeight;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
private readonly short dmspecVersion;
private readonly short dmdriverVersion;
private readonly short dmdriverExtra;
private readonly int dmfields;
private readonly int dmpositionX;
private readonly int dmpositionY;
private readonly int dmdisplayOrientation;
private readonly int dmdisplayFixedOutput;
private readonly short dmcolor;
private readonly short dmduplex;
private readonly short dmyResolution;
private readonly short dmtTOption;
private readonly short dmcollate;
}
编辑:我现在将代码更改为:
[StructLayout(LayoutKind.Sequential)]
public struct Devmode
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
private readonly string dmdeviceName;
private readonly short dmspecVersion;
private readonly short dmdriverVersion;
public short Dmsize;
private readonly short dmdriverExtra;
private readonly int dmfields;
private readonly int dmpositionX;
private readonly int dmpositionY;
private readonly int dmdisplayOrientation;
private readonly int dmdisplayFixedOutput;
private readonly short dmcolor;
private readonly short dmduplex;
private readonly short dmyResolution;
private readonly short dmtTOption;
private readonly short dmcollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
private readonly string dmformName;
private readonly short dmlogPixels;
private readonly short dmbitsPerPel;
public int dmpelsWidth;
public int dmpelsHeight;
private readonly int dmdisplayFlags;
private readonly int dmdisplayFrequency;
private readonly int dmiCMMethod;
private readonly int dmiCMIntent;
private readonly int dmmediaType;
private readonly int dmditherType;
private readonly int dmreserved1;
private readonly int dmreserved2;
private readonly int dmpanningWidth;
private readonly int dmpanningHeight;
}
但是我收到 dmpelsWidth、dmpelsHeight 和 Dmsize 的错误。 'Public' 位会员必须在 'private' 位会员之前...
有什么想法吗?
DmDeviceName
字段缺少 MarshalAs
属性。
它应该看起来像:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DmFormName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DmDeviceName;
顺便说一句,这段代码毫无意义:
devmode.DmDeviceName = new string(new char[32]);
devmode.DmFormName = new string(new char[32]);
只需删除这些行。这些值将由调用的 WinAPI 函数填充(如果可能)。
而最大的问题是:你的结构定义无效!字段顺序重要!您不能重新排序字段。请像我一样使用结构定义 .
我正在尝试更改核心项目中的分辨率。
var devmode = default(Devmode);
devmode.DmDeviceName = new string(new char[32]);
devmode.DmFormName = new string(new char[32]);
devmode.Dmsize = (short)Marshal.SizeOf(devmode);
在上述代码的第 3 行,它失败并产生 "cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed" 错误。
任何人都可以提供一些关于我应该如何解决这个问题的见解吗?奇怪的是,在我提取一些不应该影响此代码的其他代码之前,它工作正常。
结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Devmode
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DmFormName;
public string DmDeviceName;
public short Dmsize;
public int DmPelsWidth;
public int DmPelsHeight;
private readonly short dmlogPixels;
private readonly short dmbitsPerPel;
private readonly int dmdisplayFlags;
private readonly int dmdisplayFrequency;
private readonly int dmiCMMethod;
private readonly int dmiCMIntent;
private readonly int dmmediaType;
private readonly int dmditherType;
private readonly int dmreserved1;
private readonly int dmreserved2;
private readonly int dmpanningWidth;
private readonly int dmpanningHeight;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
private readonly short dmspecVersion;
private readonly short dmdriverVersion;
private readonly short dmdriverExtra;
private readonly int dmfields;
private readonly int dmpositionX;
private readonly int dmpositionY;
private readonly int dmdisplayOrientation;
private readonly int dmdisplayFixedOutput;
private readonly short dmcolor;
private readonly short dmduplex;
private readonly short dmyResolution;
private readonly short dmtTOption;
private readonly short dmcollate;
}
编辑:我现在将代码更改为:
[StructLayout(LayoutKind.Sequential)]
public struct Devmode
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
private readonly string dmdeviceName;
private readonly short dmspecVersion;
private readonly short dmdriverVersion;
public short Dmsize;
private readonly short dmdriverExtra;
private readonly int dmfields;
private readonly int dmpositionX;
private readonly int dmpositionY;
private readonly int dmdisplayOrientation;
private readonly int dmdisplayFixedOutput;
private readonly short dmcolor;
private readonly short dmduplex;
private readonly short dmyResolution;
private readonly short dmtTOption;
private readonly short dmcollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
private readonly string dmformName;
private readonly short dmlogPixels;
private readonly short dmbitsPerPel;
public int dmpelsWidth;
public int dmpelsHeight;
private readonly int dmdisplayFlags;
private readonly int dmdisplayFrequency;
private readonly int dmiCMMethod;
private readonly int dmiCMIntent;
private readonly int dmmediaType;
private readonly int dmditherType;
private readonly int dmreserved1;
private readonly int dmreserved2;
private readonly int dmpanningWidth;
private readonly int dmpanningHeight;
}
但是我收到 dmpelsWidth、dmpelsHeight 和 Dmsize 的错误。 'Public' 位会员必须在 'private' 位会员之前...
有什么想法吗?
DmDeviceName
字段缺少 MarshalAs
属性。
它应该看起来像:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DmFormName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DmDeviceName;
顺便说一句,这段代码毫无意义:
devmode.DmDeviceName = new string(new char[32]);
devmode.DmFormName = new string(new char[32]);
只需删除这些行。这些值将由调用的 WinAPI 函数填充(如果可能)。
而最大的问题是:你的结构定义无效!字段顺序重要!您不能重新排序字段。请像我一样使用结构定义