Add External-Marshalling Attributes for Structs

    The Visual Basic Upgrade Companion is able to add marshalling information to the structures used in WIN-API calls. These extra attributes allows the resulting .NET code to keep coherency with most of the legacy behavior found on the unmanaged code of the WIN API dlls.

    Original VB6 Code

    Type
    Private Type ACTYLG_TYPE
        lFirstField              As Long         ' <Force proper alignment>
        lIDN                     As Long         ' INTEGER NOT NULL
        sCNCRCY_USER_IDN         As String * 8   ' CHAR (8) NOT NULL
        sTABLE_ALIAS_NAME        As String * 6   ' CHAR (6) NOT NULL
        iTABLE_UNQ_IDN_NI        As Integer      ' <Null Indicator>
        lTABLE_UNQ_IDN           As Long         ' INTEGER
        iTABLE_UNQ_SEQ_NUM_NI    As Integer      ' <Null Indicator>
        iTABLE_UNQ_SEQ_NUM       As Integer      ' SMALLINT
    End Type
    

    Resulting .NET Code:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    private struct ACTYLG_TYPE
    {
        public int lFirstField; // <Force proper alignment>
        public int lIDN; // INTEGER NOT NULL
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    private char[] _sCNCRCY_USER_IDN; // CHAR (8) NOT NULL
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] 
    private char[] _sTABLE_ALIAS_NAME; // CHAR (6) NOT NULL
        public short iTABLE_UNQ_IDN_NI; // <Null Indicator>
        public int lTABLE_UNQ_IDN; // INTEGER
        public short iTABLE_UNQ_SEQ_NUM_NI; // <Null Indicator>
        public short iTABLE_UNQ_SEQ_NUM; // SMALLINT
    
        public string sCNCRCY_USER_IDN
        {
            set { Utils.CopyValToArray(value, _sCNCRCY_USER_IDN, 8); }
            get { return new String(_sCNCRCY_USER_IDN); }
        }
        public string sTABLE_ALIAS_NAME
        {
            set { Utils.CopyValToArray(value, _sTABLE_ALIAS_NAME, 6); }
            get { return new String(_sTABLE_ALIAS_NAME); }
        }
    
        public static ACTYLG_TYPE CreateInstance()
        {
            ACTYLG_TYPE result = new ACTYLG_TYPE();
            result._sCNCRCY_USER_IDN = new char[8];
            result._sTABLE_ALIAS_NAME = new char[6];
            return result;
        }
    }

    Download VBUC Free Trial
    Download VBUC Now

    It's time to eradicate VB6
    ROI of eradicating VB6

    8 Proven Tips for
    Planning a Successful Migration

    8 Tips for migration