ฉันกำลังพยายามเปลี่ยนความละเอียดในโครงการหลัก
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 ของโค้ดด้านบน ล้มเหลวและสร้างข้อผิดพลาด "ไม่สามารถจัดเป็นโครงสร้างที่ไม่มีการจัดการ ไม่สามารถคำนวณขนาดหรือออฟเซ็ตที่มีความหมายได้"
ใครสามารถให้ข้อมูลเชิงลึกว่าฉันควรแก้ไขปัญหานี้อย่างไร สิ่งที่แปลกคือมันทำงานได้ดีก่อนที่ฉันจะดึงโค้ดอื่นที่ไม่ควรส่งผลต่อโค้ดนี้
โครงสร้าง:
[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 สมาชิก 'สาธารณะ' ต้องมาก่อนสมาชิก 'ส่วนตัว'...
มีความคิดอะไรบ้าง?