将VB6类型转换为C#结构

Moh*_*han 1 c# vb6 interop vb6-migration

Public Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
Run Code Online (Sandbox Code Playgroud)

这是我原来的VB6代码和转换后的C#代码

public struct WIN32_FIND_DATA
{
    long dwFileAttributes;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    long nFileSizeHigh;
    long nFileSizeLow;
    long dwReserved0;
    long dwReserved1;
    cFileName As String * max_path;
    cAlternate As String * 14
}
Run Code Online (Sandbox Code Playgroud)

如何转换cFileName As String * max_path成C#

Dmi*_*nko 5

看来,要编组struct(例如打电话时FindFirstFileEx,FindNextFileAPI函数); 如果是你的情况

using System.Runtime.InteropServices;

... 

[StructLayout(LayoutKind.Sequential)]
struct WIN32_FIND_DATA
{
    public uint dwFileAttributes;
    public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime;
    public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
    public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
    public uint nFileSizeHigh;
    public uint nFileSizeLow;
    public uint dwReserved0;
    public uint dwReserved1;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] // MAX_PATH = 260
    public string cFileName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
    public string cAlternateFileName;
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅原始WIN32_FIND_DATA声明