/*
 * Copyright 2011 Alistair Leslie-Hughes
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#pragma makedep register

[
    helpstring("Microsoft Common Language Runtime Host V2"),
    threading(both),
    progid("CLRMetaData.CLRRuntimeHost.1"),
    vi_progid("CLRMetaData.CLRRuntimeHost"),
    uuid(90F1A06E-7712-4762-86B5-7A5EBA6BDB01),
]
coclass ICLRRuntimeHost
{
}

[
    helpstring("Microsoft Common Language Runtime Host V2"),
    threading(both),
    progid("CLRMetaData.CLRRuntimeHost.2"),
    vi_progid("CLRMetaData.CLRRuntimeHost"),
    uuid(90F1A06E-7712-4762-86B5-7A5EBA6BDB02),
]
coclass CLRRuntimeHost
{
}

[
    helpstring("Microsoft Common Language Runtime Meta Data"),
    threading(both),
    progid("CLRMetaData.CorMetaDataDispenser.2"),
    vi_progid("CLRMetaData.CorMetaDataDispenser"),
    uuid(E5CB7A31-7512-11D2-89CE-0080C792E5D8),
]
coclass CorMetaDataDispenser
{
}

[
    helpstring("Microsoft Common Language Runtime Meta Data"),
    threading(both),
    progid("CLRMetaData.CorMetaDataDispenserRuntime.2"),
    vi_progid("CLRMetaData.CorMetaDataDispenserRuntime"),
    uuid(1EC2DE53-75CC-11d2-9775-00A0C9B4D50C),
]
coclass CorMetaDataDispenserRuntime
{
}

[
    helpstring("Microsoft Common Language Runtime Host"),
    threading(both),
    progid("CLRMetaData.CorRuntimeHost.2"),
    vi_progid("CLRMetaData.CorRuntimeHost"),
    uuid(CB2F6723-AB3A-11d2-9C40-00C04FA30A3E),
]
coclass CorRuntimeHost
{
}
