Tôi đang cố gắng tạo một số tệp vhd/vhdx bằng cách sử dụng API VHD trong C#.Liên minh C++ trong C# - hành vi kỳ lạ
Có một C++ đoàn trông như thế này:
typedef struct _CREATE_VIRTUAL_DISK_PARAMETERS
{
CREATE_VIRTUAL_DISK_VERSION Version;
union
{
struct
{
GUID UniqueId;
ULONGLONG MaximumSize;
ULONG BlockSizeInBytes;
ULONG SectorSizeInBytes;
PCWSTR ParentPath;
PCWSTR SourcePath;
} Version1;
struct
{
GUID UniqueId;
ULONGLONG MaximumSize;
ULONG BlockSizeInBytes;
ULONG SectorSizeInBytes;
ULONG PhysicalSectorSizeInBytes;
PCWSTR ParentPath;
PCWSTR SourcePath;
OPEN_VIRTUAL_DISK_FLAG OpenFlags;
VIRTUAL_STORAGE_TYPE ParentVirtualStorageType;
VIRTUAL_STORAGE_TYPE SourceVirtualStorageType;
GUID ResiliencyGuid;
} Version2;
struct
{
GUID UniqueId;
ULONGLONG MaximumSize;
ULONG BlockSizeInBytes;
ULONG SectorSizeInBytes;
ULONG PhysicalSectorSizeInBytes;
PCWSTR ParentPath;
PCWSTR SourcePath;
OPEN_VIRTUAL_DISK_FLAG OpenFlags;
VIRTUAL_STORAGE_TYPE ParentVirtualStorageType;
VIRTUAL_STORAGE_TYPE SourceVirtualStorageType;
GUID ResiliencyGuid;
PCWSTR SourceLimitPath;
VIRTUAL_STORAGE_TYPE BackingStorageType;
} Version3;
};
} CREATE_VIRTUAL_DISK_PARAMETERS, *PCREATE_VIRTUAL_DISK_PARAMETERS;
Tôi đang cố gắng để chuyển đổi đó đến C#, nhưng không có nhiều may mắn. Tôi không quan tâm đến Version3 chút nào, vì vậy tôi bỏ nó ra.
Tôi đã thử một số thứ và tốt nhất tôi có thể làm là sử dụng phiên bản 2 (bằng cách làm điều gì đó kỳ lạ), nhưng tôi chưa bao giờ quản lý phiên bản 1 và Version2 cùng một lúc.
Các giải pháp mà đã nắm giữ các kết quả tốt nhất cho đến nay đã được điều này, nhưng phải có một cái gì đó sai đó vì version1 chỉ đơn giản là không làm việc, và SectorSizeInBytes
trong version1 là một ulong
hơn uint
(nếu tôi thay đổi nó để uint
như nó phải là, tôi phá vỡ Version2 và version1 vẫn không hoạt động!)
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
public struct CreateVirtualDiskParameters
{
[FieldOffset(0)] public CreateVirtualDiskParametersVersion1 Version1;
[FieldOffset(0)] public CreateVirtualDiskParametersVersion2 Version2;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CreateVirtualDiskParametersVersion1
{
public CreateVirtualDiskVersion Version;
public Guid UniqueId;
public ulong MaximumSize;
public uint BlockSizeInBytes;
public ulong SectorSizeInBytes;
public string ParentPath;
public string SourcePath;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CreateVirtualDiskParametersVersion2
{
public CreateVirtualDiskVersion Version;
public Guid UniqueId;
public ulong MaximumSize;
public uint BlockSizeInBytes;
public uint SectorSizeInBytes;
public uint PhysicalSectorSizeInBytes;
public string ParentPath;
public string SourcePath;
public OpenVirtualDiskFlags OpenFlags;
public VirtualStorageType ParentVirtualStorageType;
public VirtualStorageType SourceVirtualStorageType;
public Guid ResiliencyGuid;
}
tôi biết lý thuyết lĩnh vực Version
nên được đặt bên ngoài các cấu trúc bản và tôi đã cố gắng đó là tốt, nhưng nó chỉ phá vỡ những thứ thậm chí còn vui hơn ...
Vì vậy, ai đó có thể tư vấn làm thế nào để đúng cách dịch các bên trên để C#, rời khỏi cấu trúc Version3 như đó là không cần thiết?
'ULONGLONG (64 bit)' và 'ULONG (32 bit)' cả hai dường như được ánh xạ tới 'ulong (64 bit)'. – AlexD
Bạn đã thử in các offset của các thành viên trong cấu trúc C++ của bạn chưa? –
@TheodorosChatzigiannakis không hoàn toàn chắc chắn làm thế nào tôi sẽ làm điều đó mang trong tâm trí nó chứa enums/structs và dây. Ý tôi là, kích thước của chúng là bao nhiêu? Tôi đang mở để thử nó, cho tôi biết những gì giá trị để sử dụng và tôi sẽ cho nó một shot. – cogumel0