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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
#include "common.h"
#include "assemblybinder.hpp"
#include "coreclrbindercommon.h"
#include "clrprivbindercoreclr.h"
#include "bundle.h"
using namespace BINDER_SPACE;
HRESULT CCoreCLRBinderHelper::DefaultBinderSetupContext(DWORD dwAppDomainId,CLRPrivBinderCoreCLR **ppTPABinder)
{
HRESULT hr = S_OK;
EX_TRY
{
if(ppTPABinder != NULL)
{
ReleaseHolder<CLRPrivBinderCoreCLR> pBinder;
SAFE_NEW(pBinder, CLRPrivBinderCoreCLR);
BINDER_SPACE::ApplicationContext *pApplicationContext = pBinder->GetAppContext();
UINT_PTR binderId;
pBinder->GetBinderID(&binderId);
hr = pApplicationContext->Init(binderId);
if(SUCCEEDED(hr))
{
pApplicationContext->SetAppDomainId(dwAppDomainId);
pBinder->SetManagedAssemblyLoadContext(NULL);
*ppTPABinder = clr::SafeAddRef(pBinder.Extract());
}
}
}
EX_CATCH_HRESULT(hr);
Exit:
return hr;
}
HRESULT CCoreCLRBinderHelper::GetAssemblyIdentity(LPCSTR szTextualIdentity,
BINDER_SPACE::ApplicationContext *pApplicationContext,
NewHolder<AssemblyIdentityUTF8> &assemblyIdentityHolder)
{
HRESULT hr = S_OK;
VALIDATE_ARG_RET(szTextualIdentity != NULL);
EX_TRY
{
AssemblyIdentityUTF8 *pAssemblyIdentity = NULL;
if (pApplicationContext != NULL)
{
// This returns a cached copy owned by application context
hr = pApplicationContext->GetAssemblyIdentity(szTextualIdentity, &pAssemblyIdentity);
if(SUCCEEDED(hr))
{
assemblyIdentityHolder = pAssemblyIdentity;
assemblyIdentityHolder.SuppressRelease();
}
}
else
{
SString sTextualIdentity;
sTextualIdentity.SetUTF8(szTextualIdentity);
// This is a private copy
pAssemblyIdentity = new AssemblyIdentityUTF8();
hr = TextualIdentityParser::Parse(sTextualIdentity, pAssemblyIdentity);
if(SUCCEEDED(hr))
{
pAssemblyIdentity->PopulateUTF8Fields();
assemblyIdentityHolder = pAssemblyIdentity;
}
}
}
EX_CATCH_HRESULT(hr);
return hr;
}
//=============================================================================
// Functions that provides binding services beyond the ICLRPrivInterface
//-----------------------------------------------------------------------------
HRESULT CCoreCLRBinderHelper::BindToSystem(ICLRPrivAssembly **ppSystemAssembly, bool fBindToNativeImage)
{
HRESULT hr = S_OK;
VALIDATE_ARG_RET(ppSystemAssembly != NULL);
EX_TRY
{
ReleaseHolder<BINDER_SPACE::Assembly> pAsm;
StackSString systemPath(SystemDomain::System()->SystemDirectory());
hr = AssemblyBinder::BindToSystem(systemPath, &pAsm, fBindToNativeImage);
if(SUCCEEDED(hr))
{
_ASSERTE(pAsm != NULL);
*ppSystemAssembly = pAsm.Extract();
}
}
EX_CATCH_HRESULT(hr);
return hr;
}
HRESULT CCoreCLRBinderHelper::BindToSystemSatellite(SString &systemPath,
SString &sSimpleName,
SString &sCultureName,
ICLRPrivAssembly **ppSystemAssembly)
{
HRESULT hr = S_OK;
VALIDATE_ARG_RET(ppSystemAssembly != NULL && !systemPath.IsEmpty());
EX_TRY
{
ReleaseHolder<BINDER_SPACE::Assembly> pAsm;
hr = AssemblyBinder::BindToSystemSatellite(systemPath, sSimpleName, sCultureName, &pAsm);
if(SUCCEEDED(hr))
{
_ASSERTE(pAsm != NULL);
*ppSystemAssembly = pAsm.Extract();
}
}
EX_CATCH_HRESULT(hr);
return hr;
}
|