| 1 | // Licensed to the .NET Foundation under one or more agreements. | 
|---|
| 2 | // The .NET Foundation licenses this file to you under the MIT license. | 
|---|
| 3 | // See the LICENSE file in the project root for more information. | 
|---|
| 4 | // ============================================================ | 
|---|
| 5 | // | 
|---|
| 6 | // Assembly.hpp | 
|---|
| 7 | // | 
|---|
| 8 |  | 
|---|
| 9 |  | 
|---|
| 10 | // | 
|---|
| 11 | // Defines the Assembly class | 
|---|
| 12 | // | 
|---|
| 13 | // ============================================================ | 
|---|
| 14 |  | 
|---|
| 15 | #ifndef __BINDER__ASSEMBLY_HPP__ | 
|---|
| 16 | #define __BINDER__ASSEMBLY_HPP__ | 
|---|
| 17 |  | 
|---|
| 18 | #include "bindertypes.hpp" | 
|---|
| 19 | #include "assemblyname.hpp" | 
|---|
| 20 |  | 
|---|
| 21 | #include "corpriv.h" | 
|---|
| 22 | #include "clrprivbinding.h" | 
|---|
| 23 |  | 
|---|
| 24 | #include "clrprivbindercoreclr.h" | 
|---|
| 25 |  | 
|---|
| 26 | #if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) | 
|---|
| 27 | #include "clrprivbinderassemblyloadcontext.h" | 
|---|
| 28 | #endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) | 
|---|
| 29 |  | 
|---|
| 30 | STDAPI BinderAcquirePEImage(LPCTSTR   szAssemblyPath, | 
|---|
| 31 | PEImage **ppPEImage, | 
|---|
| 32 | PEImage **ppNativeImage, | 
|---|
| 33 | BOOL      fExplicitBindToNativeImage); | 
|---|
| 34 |  | 
|---|
| 35 | STDAPI BinderAcquireImport(PEImage                  *pPEImage, | 
|---|
| 36 | IMDInternalImport       **pIMetaDataAssemblyImport, | 
|---|
| 37 | DWORD                    *pdwPAFlags, | 
|---|
| 38 | BOOL                     bNativeImage); | 
|---|
| 39 |  | 
|---|
| 40 | STDAPI (PEImage *pPEImage, | 
|---|
| 41 | BOOL    *result); | 
|---|
| 42 |  | 
|---|
| 43 | STDAPI BinderGetImagePath(PEImage *pPEImage, | 
|---|
| 44 | SString &imagePath); | 
|---|
| 45 |  | 
|---|
| 46 | STDAPI BinderReleasePEImage(PEImage *pPEImage); | 
|---|
| 47 |  | 
|---|
| 48 | STDAPI BinderAddRefPEImage(PEImage *pPEImage); | 
|---|
| 49 |  | 
|---|
| 50 | namespace BINDER_SPACE | 
|---|
| 51 | { | 
|---|
| 52 |  | 
|---|
| 53 | // An assembly represents a particular set of bits.  However we extend this to | 
|---|
| 54 | // also include whether those bits have precompiled information (NGEN).   Thus | 
|---|
| 55 | // and assembly knows whether it has an NGEN image or not. | 
|---|
| 56 | // | 
|---|
| 57 | // This allows us to preferentially use the NGEN image if it is available. | 
|---|
| 58 | class Assembly | 
|---|
| 59 | : public ICLRPrivAssembly | 
|---|
| 60 | { | 
|---|
| 61 | public: | 
|---|
| 62 | // -------------------------------------------------------------------- | 
|---|
| 63 | // IUnknown methods | 
|---|
| 64 | // -------------------------------------------------------------------- | 
|---|
| 65 | STDMETHOD(QueryInterface)(REFIID riid, | 
|---|
| 66 | void ** ppv); | 
|---|
| 67 | STDMETHOD_(ULONG, AddRef)(); | 
|---|
| 68 | STDMETHOD_(ULONG, Release)(); | 
|---|
| 69 |  | 
|---|
| 70 | // -------------------------------------------------------------------- | 
|---|
| 71 | // ICLRPrivAssembly methods | 
|---|
| 72 | // -------------------------------------------------------------------- | 
|---|
| 73 | LPCWSTR GetSimpleName(); | 
|---|
| 74 |  | 
|---|
| 75 | STDMETHOD(BindAssemblyByName)( | 
|---|
| 76 | IAssemblyName * pIAssemblyName, | 
|---|
| 77 | ICLRPrivAssembly ** ppAssembly); | 
|---|
| 78 |  | 
|---|
| 79 | STDMETHOD(IsShareable)(BOOL * pbIsShareable); | 
|---|
| 80 |  | 
|---|
| 81 | STDMETHOD(GetAvailableImageTypes)(PDWORD pdwImageTypes); | 
|---|
| 82 |  | 
|---|
| 83 | STDMETHOD(GetImageResource)( | 
|---|
| 84 | DWORD dwImageType, | 
|---|
| 85 | DWORD *pdwImageType, | 
|---|
| 86 | ICLRPrivResource ** ppIResource); | 
|---|
| 87 |  | 
|---|
| 88 | STDMETHOD(GetBinderID)(UINT_PTR *pBinderId); | 
|---|
| 89 |  | 
|---|
| 90 | STDMETHOD(GetLoaderAllocator)(LPVOID* pLoaderAllocator); | 
|---|
| 91 |  | 
|---|
| 92 | // -------------------------------------------------------------------- | 
|---|
| 93 | // Assembly methods | 
|---|
| 94 | // -------------------------------------------------------------------- | 
|---|
| 95 | Assembly(); | 
|---|
| 96 | virtual ~Assembly(); | 
|---|
| 97 |  | 
|---|
| 98 | HRESULT Init(/* in */ IMDInternalImport       *pIMetaDataAssemblyImport, | 
|---|
| 99 | /* in */ PEKIND                   PeKind, | 
|---|
| 100 | /* in */ PEImage                 *pPEImage, | 
|---|
| 101 | /* in */ PEImage                 *pPENativeImage, | 
|---|
| 102 | /* in */ SString                 &assemblyPath, | 
|---|
| 103 | /* in */ BOOL                     fInspectionOnly, | 
|---|
| 104 | /* in */ BOOL                     fIsInGAC); | 
|---|
| 105 |  | 
|---|
| 106 | // Enumerates dependent assemblies | 
|---|
| 107 | HRESULT GetNextAssemblyNameRef(/* in  */ DWORD          nIndex, | 
|---|
| 108 | /* out */ AssemblyName **ppAssemblyName); | 
|---|
| 109 |  | 
|---|
| 110 | inline AssemblyName *GetAssemblyName(BOOL fAddRef = FALSE); | 
|---|
| 111 | inline BOOL GetIsInGAC(); | 
|---|
| 112 | inline BOOL GetIsDynamicBind(); | 
|---|
| 113 | inline void SetIsDynamicBind(BOOL fIsDynamicBind); | 
|---|
| 114 | inline BOOL GetIsByteArray(); | 
|---|
| 115 | inline void SetIsByteArray(BOOL fIsByteArray); | 
|---|
| 116 | inline BOOL GetIsSharable(); | 
|---|
| 117 | inline void SetIsSharable(BOOL fIsSharable); | 
|---|
| 118 | inline SString &GetPath(); | 
|---|
| 119 |  | 
|---|
| 120 | inline PEImage *GetPEImage(BOOL fAddRef = FALSE); | 
|---|
| 121 | inline PEImage *GetNativePEImage(BOOL fAddRef = FALSE); | 
|---|
| 122 | inline PEImage *GetNativeOrILPEImage(BOOL fAddRef = FALSE); | 
|---|
| 123 |  | 
|---|
| 124 | HRESULT GetMVID(GUID *pMVID); | 
|---|
| 125 |  | 
|---|
| 126 | static PEKIND GetSystemArchitecture(); | 
|---|
| 127 | static BOOL IsValidArchitecture(PEKIND kArchitecture); | 
|---|
| 128 |  | 
|---|
| 129 | inline ICLRPrivBinder* GetBinder() | 
|---|
| 130 | { | 
|---|
| 131 | return m_pBinder; | 
|---|
| 132 | } | 
|---|
| 133 |  | 
|---|
| 134 | #ifndef CROSSGEN_COMPILE | 
|---|
| 135 | protected: | 
|---|
| 136 | #endif | 
|---|
| 137 | // Asssembly Flags | 
|---|
| 138 | enum | 
|---|
| 139 | { | 
|---|
| 140 | FLAG_NONE = 0x00, | 
|---|
| 141 | FLAG_INSPECTION_ONLY = 0x01, | 
|---|
| 142 | FLAG_IS_IN_GAC = 0x02, | 
|---|
| 143 | FLAG_IS_DYNAMIC_BIND = 0x04, | 
|---|
| 144 | FLAG_IS_BYTE_ARRAY = 0x08, | 
|---|
| 145 | FLAG_IS_SHARABLE = 0x10 | 
|---|
| 146 | }; | 
|---|
| 147 |  | 
|---|
| 148 | inline void SetPEImage(PEImage *pPEImage); | 
|---|
| 149 | inline void SetNativePEImage(PEImage *pNativePEImage); | 
|---|
| 150 |  | 
|---|
| 151 | inline void SetAssemblyName(AssemblyName *pAssemblyName, | 
|---|
| 152 | BOOL          fAddRef = TRUE); | 
|---|
| 153 | inline BOOL GetInspectionOnly(); | 
|---|
| 154 | inline void SetInspectionOnly(BOOL fInspectionOnly); | 
|---|
| 155 | inline void SetIsInGAC(BOOL fIsInGAC); | 
|---|
| 156 |  | 
|---|
| 157 | inline IMDInternalImport *GetMDImport(); | 
|---|
| 158 | inline void SetMDImport(IMDInternalImport *pMDImport); | 
|---|
| 159 | inline mdAssembly *GetAssemblyRefTokens(); | 
|---|
| 160 |  | 
|---|
| 161 | inline DWORD GetNbAssemblyRefTokens(); | 
|---|
| 162 | inline void SetNbAsssemblyRefTokens(DWORD dwCAssemblyRefTokens); | 
|---|
| 163 |  | 
|---|
| 164 | LONG                     m_cRef; | 
|---|
| 165 | PEImage                 *m_pPEImage; | 
|---|
| 166 | PEImage                 *m_pNativePEImage; | 
|---|
| 167 | IMDInternalImport       *m_pMDImport; | 
|---|
| 168 | mdAssembly              *m_pAssemblyRefTokens; | 
|---|
| 169 | DWORD                    m_dwCAssemblyRefTokens; | 
|---|
| 170 | AssemblyName            *m_pAssemblyName; | 
|---|
| 171 | SString                  m_assemblyPath; | 
|---|
| 172 | DWORD                    m_dwAssemblyFlags; | 
|---|
| 173 | ICLRPrivBinder          *m_pBinder; | 
|---|
| 174 |  | 
|---|
| 175 | // Nested class used to implement ICLRPriv binder related interfaces | 
|---|
| 176 | class CLRPrivResourceAssembly : | 
|---|
| 177 | public ICLRPrivResource, public ICLRPrivResourceAssembly | 
|---|
| 178 | { | 
|---|
| 179 | public: | 
|---|
| 180 | STDMETHOD(QueryInterface)(REFIID riid, void ** ppv); | 
|---|
| 181 | STDMETHOD_(ULONG, AddRef)(); | 
|---|
| 182 | STDMETHOD_(ULONG, Release)(); | 
|---|
| 183 | STDMETHOD(GetResourceType)(IID *pIID); | 
|---|
| 184 | STDMETHOD(GetAssembly)(LPVOID *ppAssembly); | 
|---|
| 185 | } m_clrPrivRes; | 
|---|
| 186 |  | 
|---|
| 187 | inline void SetBinder(ICLRPrivBinder *pBinder) | 
|---|
| 188 | { | 
|---|
| 189 | _ASSERTE(m_pBinder == NULL || m_pBinder == pBinder); | 
|---|
| 190 | m_pBinder = pBinder; | 
|---|
| 191 | } | 
|---|
| 192 |  | 
|---|
| 193 | friend class ::CLRPrivBinderCoreCLR; | 
|---|
| 194 |  | 
|---|
| 195 | #if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) | 
|---|
| 196 | friend class ::CLRPrivBinderAssemblyLoadContext; | 
|---|
| 197 | #endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) | 
|---|
| 198 | }; | 
|---|
| 199 |  | 
|---|
| 200 | // This is a fast version which goes around the COM interfaces and directly | 
|---|
| 201 | // casts the interfaces and does't AddRef | 
|---|
| 202 | inline BINDER_SPACE::Assembly * GetAssemblyFromPrivAssemblyFast(ICLRPrivAssembly *pPrivAssembly); | 
|---|
| 203 |  | 
|---|
| 204 | #include "assembly.inl" | 
|---|
| 205 | }; | 
|---|
| 206 |  | 
|---|
| 207 | #endif | 
|---|
| 208 |  | 
|---|