Welcome to mirror list, hosted at ThFree Co, Russian Federation.

coreclrbindercommon.cpp « binder « coreclr « src - github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ebe3137c77f14c3c3315d54e375f76b3187e86be (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
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;
}