summaryrefslogtreecommitdiff
path: root/src/vm/comtypelibconverter.h
blob: f835999794f65c6092bea0033259d4642c6f519b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

/*============================================================
**
** Header:  COMTypeLibConverter.h
**
**
** Purpose: Definition of the native methods used by the 
**          typelib converter.
**
** 
===========================================================*/

#ifndef _COMTYPELIBCONVERTER_H
#define _COMTYPELIBCONVERTER_H

#ifndef FEATURE_COMINTEROP
#error FEATURE_COMINTEROP is required for this file
#endif // FEATURE_COMINTEROP
#ifndef FEATURE_COMINTEROP_TLB_SUPPORT
#error FEATURE_COMINTEROP_TLB_SUPPORT is required for this file
#endif // FEATURE_COMINTEROP

#include "vars.hpp"

struct ITypeLibImporterNotifySink;
class ImpTlbEventInfo;


enum TlbImporterFlags
{
    TlbImporter_PrimaryInteropAssembly          = 0x00000001,   // Generate a PIA.
    TlbImporter_UnsafeInterfaces                = 0x00000002,   // Generate unsafe interfaces.
    TlbImporter_SafeArrayAsSystemArray          = 0x00000004,   // Safe array import control.
    TlbImporter_TransformDispRetVals            = 0x00000008,   // Disp only itf [out, retval] transformation.
    TlbImporter_PreventClassMembers             = 0x00000010,   // Prevent adding members to class.
    TlbImporter_SerializableValueClasses        = 0x00000020,   // Mark value classes as serializable.
    TlbImporter_ImportAsX86                     = 0x00000100,   // Import to a 32-bit assembly
    TlbImporter_ImportAsX64                     = 0x00000200,   // Import to an x64 assembly
    TlbImporter_ImportAsItanium                 = 0x00000400,   // Import to an itanium assembly
    TlbImporter_ImportAsAgnostic                = 0x00000800,   // Import to an agnostic assembly
    TlbImporter_ReflectionOnlyLoading           = 0x00001000,   // Use ReflectionOnly loading.
    TlbImporter_NoDefineVersionResource         = 0x00002000,   // Don't call AssemblyBuilder.DefineVersionResource
    TlbImporter_ImportAsArm                     = 0x00004000,   // Import to an ARM assembly
    TlbImporter_ValidFlags                      = TlbImporter_PrimaryInteropAssembly | 
                                                  TlbImporter_UnsafeInterfaces | 
                                                  TlbImporter_SafeArrayAsSystemArray |
                                                  TlbImporter_TransformDispRetVals |
                                                  TlbImporter_PreventClassMembers |
                                                  TlbImporter_SerializableValueClasses |
                                                  TlbImporter_ImportAsX86 |
                                                  TlbImporter_ImportAsX64 |
                                                  TlbImporter_ImportAsItanium |
                                                  TlbImporter_ImportAsAgnostic |
                                                  TlbImporter_ReflectionOnlyLoading |
                                                  TlbImporter_NoDefineVersionResource |
                                                  TlbImporter_ImportAsArm
};

// Note that the second hex digit is reserved
enum TlbExporterFlags
{
    TlbExporter_OnlyReferenceRegistered         = 0x00000001,   // Only reference an external typelib if it is registered.
    TlbExporter_CallerResolvedReferences        = 0x00000002,   // Always allow caller to resolve typelib references first
    TlbExporter_OldNames                        = 0x00000004,   // Do not ignore non COM visible types when doing name decoration.
//  TlbExporter_Unused                          = 0x00000008,   // This is currently unused - feel free to use this for another switch
    TlbExporter_ExportAs32Bit                   = 0x00000010,   // Export the type library using 32-bit semantics
    TlbExporter_ExportAs64Bit                   = 0x00000020,   // Export the type library using 64-bit semantics
//  TlbExporter_Reserved                        = 0x00000040,   // Do not use this
//  TlbExporter_Reserved                        = 0x00000080,   // Do not use this
    TlbExporter_ValidFlags                      = TlbExporter_OnlyReferenceRegistered | 
                                                  TlbExporter_CallerResolvedReferences | 
                                                  TlbExporter_OldNames |
                                                  TlbExporter_ExportAs32Bit |
                                                  TlbExporter_ExportAs64Bit
};

#define TlbExportAsMask         0x000000F0
#define TlbExportAs32Bit(x)     ((TlbExportAsMask & x) == TlbExporter_ExportAs32Bit)
#define TlbExportAs64Bit(x)     ((TlbExportAsMask & x) == TlbExporter_ExportAs64Bit)
#define TlbExportAsDefault(x)   ((!TlbExportAs32Bit(x)) && (!TlbExportAs64Bit(x)))

class COMTypeLibConverter
{
public:
    static FCDECL4(Object*, ConvertAssemblyToTypeLib, Object* AssemblyUNSAFE, StringObject* TypeLibNameUNSAFE, DWORD Flags, Object* NotifySinkUNSAFE);
    static FCDECL7(void, ConvertTypeLibToMetadata, Object* TypeLibUNSAFE, Object* AsmBldrUNSAFE, Object* ModBldrUNSAFE, StringObject* NamespaceUNSAFE, TlbImporterFlags Flags, Object* NotifySinkUNSAFE, OBJECTREF* pEventItfInfoList);

private:
    static void             Init();
    static void             CreateItfInfoList(OBJECTREF* pEventItfInfoList);
    static void             GetEventItfInfoList(CImportTlb *pImporter, Assembly *pAssembly, OBJECTREF *pEventItfInfoList);
    static OBJECTREF        GetEventItfInfo(Assembly *pAssembly, ImpTlbEventInfo *pImpTlbEventInfo);
    static void             TypeLibImporterWrapper(ITypeLib *pITLB, LPCWSTR szFname, LPCWSTR szNamespace, IMetaDataEmit *pEmit, Assembly *pAssembly, Module *pModule, ITypeLibImporterNotifySink *pNotify, TlbImporterFlags flags, CImportTlb **ppImporter);

    static void             ConvertAssemblyToTypeLibInternal(OBJECTREF* ppAssembly, STRINGREF* ppTypeLibName, DWORD Flags, OBJECTREF* ppNotifySink, OBJECTREF* pRetObj);
    static void             COMTypeLibConverter::LoadType(Module * pModule,
                                                          mdTypeDef cl,
                                                          TlbImporterFlags Flags);
    static void             ConvertTypeLibToMetadataInternal(OBJECTREF* ppTypeLib, OBJECTREF* ppAsmBldr, OBJECTREF* ppModBldr, STRINGREF* ppNamespace, TlbImporterFlags Flags, OBJECTREF* ppNotifySink, OBJECTREF* pEventItfInfoList);

    static BOOL             m_bInitialized;
};

#endif // _COMTYPELIBCONVERTER_H