aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-07-22 19:55:20 +1000
committerSean Hall <r.sean.hall@gmail.com>2020-07-22 20:13:49 +1000
commitd96ba4263bf243dedb62e9090072fba53bfe1316 (patch)
tree44fe48f8b8671834795b90d14e17fad889710751 /src
parent70b5d207d799308a6c3742f5d0348ab4fca75a3d (diff)
downloadwix-d96ba4263bf243dedb62e9090072fba53bfe1316.tar.gz
wix-d96ba4263bf243dedb62e9090072fba53bfe1316.tar.bz2
wix-d96ba4263bf243dedb62e9090072fba53bfe1316.zip
Use hdt_get_function_pointer in dnchost when available.
Diffstat (limited to 'src')
-rw-r--r--src/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs2
-rw-r--r--src/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj3
-rw-r--r--src/dnchost/dncutil.cpp61
-rw-r--r--src/dnchost/dncutil.h2
-rw-r--r--src/dnchost/precomp.h1
5 files changed, 61 insertions, 8 deletions
diff --git a/src/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs b/src/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs
index 0c6ea367..d38fd1a9 100644
--- a/src/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs
+++ b/src/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs
@@ -7,6 +7,8 @@ namespace WixToolset.Dnc.Host
7 using System.Reflection; 7 using System.Reflection;
8 using System.Runtime.InteropServices; 8 using System.Runtime.InteropServices;
9 9
10 delegate IBootstrapperApplicationFactory StaticEntryDelegate([MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyName, [MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyPath);
11
10 /// <summary> 12 /// <summary>
11 /// Entry point for the .NET Core host to create and return the BA to the engine. 13 /// Entry point for the .NET Core host to create and return the BA to the engine.
12 /// Reflection is used instead of referencing WixToolset.Mba.Core directly to avoid requiring it in the AssemblyLoadContext. 14 /// Reflection is used instead of referencing WixToolset.Mba.Core directly to avoid requiring it in the AssemblyLoadContext.
diff --git a/src/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj b/src/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj
index 495b13a2..707edd1b 100644
--- a/src/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj
+++ b/src/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj
@@ -24,7 +24,10 @@
24 <Line Include='#define DNC_ASSEMBLY_FILE_NAME L"$(AssemblyName).dll"' /> 24 <Line Include='#define DNC_ASSEMBLY_FILE_NAME L"$(AssemblyName).dll"' />
25 <Line Include='#define DNC_ASSEMBLY_FULL_NAME "%(AssemblyIdentity.Identity)"' /> 25 <Line Include='#define DNC_ASSEMBLY_FULL_NAME "%(AssemblyIdentity.Identity)"' />
26 <Line Include='#define DNC_ENTRY_TYPE "$(RootNamespace).BootstrapperApplicationFactory"' /> 26 <Line Include='#define DNC_ENTRY_TYPE "$(RootNamespace).BootstrapperApplicationFactory"' />
27 <Line Include='#define DNC_ENTRY_TYPEW L"$(RootNamespace).BootstrapperApplicationFactory,$(AssemblyName)"' />
27 <Line Include='#define DNC_STATIC_ENTRY_METHOD "CreateBAFactory"' /> 28 <Line Include='#define DNC_STATIC_ENTRY_METHOD "CreateBAFactory"' />
29 <Line Include='#define DNC_STATIC_ENTRY_METHODW L"CreateBAFactory"' />
30 <Line Include='#define DNC_STATIC_ENTRY_DELEGATEW L"$(RootNamespace).StaticEntryDelegate,$(AssemblyName)"' />
28 </ItemGroup> 31 </ItemGroup>
29 <Message Importance="normal" Text="Generating identity definitions into @(HeaderPath->'%(FullPath)')" /> 32 <Message Importance="normal" Text="Generating identity definitions into @(HeaderPath->'%(FullPath)')" />
30 <WriteLinesToFile File="@(HeaderPath)" Lines="@(Line)" Overwrite="True" /> 33 <WriteLinesToFile File="@(HeaderPath)" Lines="@(Line)" Overwrite="True" />
diff --git a/src/dnchost/dncutil.cpp b/src/dnchost/dncutil.cpp
index 996bf086..4a82d961 100644
--- a/src/dnchost/dncutil.cpp
+++ b/src/dnchost/dncutil.cpp
@@ -3,7 +3,9 @@
3#include "precomp.h" 3#include "precomp.h"
4 4
5// https://github.com/dotnet/runtime/blob/master/src/installer/corehost/error_codes.h 5// https://github.com/dotnet/runtime/blob/master/src/installer/corehost/error_codes.h
6#define InvalidArgFailure 0x80008081
6#define HostApiBufferTooSmall 0x80008098 7#define HostApiBufferTooSmall 0x80008098
8#define HostApiUnsupportedVersion 0x800080a2
7 9
8// internal function declarations 10// internal function declarations
9 11
@@ -24,6 +26,10 @@ static HRESULT InitializeCoreClr(
24 __in HOSTFXR_STATE* pState, 26 __in HOSTFXR_STATE* pState,
25 __in LPCWSTR wzNativeHostPath 27 __in LPCWSTR wzNativeHostPath
26 ); 28 );
29static HRESULT InitializeCoreClrPre5(
30 __in HOSTFXR_STATE* pState,
31 __in LPCWSTR wzNativeHostPath
32 );
27static HRESULT LoadCoreClr( 33static HRESULT LoadCoreClr(
28 __in HOSTFXR_STATE* pState, 34 __in HOSTFXR_STATE* pState,
29 __in LPCWSTR wzCoreClrPath 35 __in LPCWSTR wzCoreClrPath
@@ -75,14 +81,28 @@ HRESULT DnchostCreateFactory(
75 HRESULT hr = S_OK; 81 HRESULT hr = S_OK;
76 PFNCREATEBAFACTORY pfnCreateBAFactory = NULL; 82 PFNCREATEBAFACTORY pfnCreateBAFactory = NULL;
77 83
78 hr = pState->pfnCoreclrCreateDelegate( 84 if (pState->pfnGetFunctionPointer)
79 pState->pClrHandle, 85 {
80 pState->dwDomainId, 86 hr = pState->pfnGetFunctionPointer(
81 DNC_ASSEMBLY_FULL_NAME, 87 DNC_ENTRY_TYPEW,
82 DNC_ENTRY_TYPE, 88 DNC_STATIC_ENTRY_METHODW,
83 DNC_STATIC_ENTRY_METHOD, 89 DNC_STATIC_ENTRY_DELEGATEW,
84 reinterpret_cast<void**>(&pfnCreateBAFactory)); 90 NULL,
85 BalExitOnFailure(hr, "Failed to create delegate in app domain."); 91 NULL,
92 reinterpret_cast<void**>(&pfnCreateBAFactory));
93 BalExitOnFailure(hr, "Failed to create delegate through GetFunctionPointer.");
94 }
95 else
96 {
97 hr = pState->pfnCoreclrCreateDelegate(
98 pState->pClrHandle,
99 pState->dwDomainId,
100 DNC_ASSEMBLY_FULL_NAME,
101 DNC_ENTRY_TYPE,
102 DNC_STATIC_ENTRY_METHOD,
103 reinterpret_cast<void**>(&pfnCreateBAFactory));
104 BalExitOnFailure(hr, "Failed to create delegate in app domain.");
105 }
86 106
87 *ppAppFactory = pfnCreateBAFactory(wzBaFactoryAssemblyName, wzBaFactoryAssemblyPath); 107 *ppAppFactory = pfnCreateBAFactory(wzBaFactoryAssemblyName, wzBaFactoryAssemblyPath);
88 108
@@ -149,6 +169,9 @@ static HRESULT LoadHostfxr(
149 pState->pfnHostfxrClose = reinterpret_cast<hostfxr_close_fn>(::GetProcAddress(hHostfxr, "hostfxr_close")); 169 pState->pfnHostfxrClose = reinterpret_cast<hostfxr_close_fn>(::GetProcAddress(hHostfxr, "hostfxr_close"));
150 BalExitOnNullWithLastError(pState->pfnHostfxrClose, hr, "Failed to get procedure address for hostfxr_close."); 170 BalExitOnNullWithLastError(pState->pfnHostfxrClose, hr, "Failed to get procedure address for hostfxr_close.");
151 171
172 pState->pfnHostfxrGetRuntimeDelegate = reinterpret_cast<hostfxr_get_runtime_delegate_fn>(::GetProcAddress(hHostfxr, "hostfxr_get_runtime_delegate"));
173 BalExitOnNullWithLastError(pState->pfnHostfxrGetRuntimeDelegate, hr, "Failed to get procedure address for hostfxr_get_runtime_delegate.");
174
152LExit: 175LExit:
153 // Never unload the module since it isn't meant to be unloaded. 176 // Never unload the module since it isn't meant to be unloaded.
154 177
@@ -194,6 +217,28 @@ static HRESULT InitializeCoreClr(
194 ) 217 )
195{ 218{
196 HRESULT hr = S_OK; 219 HRESULT hr = S_OK;
220
221 hr = pState->pfnHostfxrGetRuntimeDelegate(pState->hostContextHandle, hdt_get_function_pointer, reinterpret_cast<void**>(&pState->pfnGetFunctionPointer));
222 if (InvalidArgFailure == hr || // old versions of hostfxr don't allow calling GetRuntimeDelegate from InitializeForApp.
223 HostApiUnsupportedVersion == hr) // hdt_get_function_pointer was added in .NET 5.
224 {
225 hr = InitializeCoreClrPre5(pState, wzNativeHostPath);
226 }
227 else
228 {
229 ExitOnFailure(hr, "HostfxrGetRuntimeDelegate failed");
230 }
231
232LExit:
233 return hr;
234}
235
236static HRESULT InitializeCoreClrPre5(
237 __in HOSTFXR_STATE* pState,
238 __in LPCWSTR wzNativeHostPath
239 )
240{
241 HRESULT hr = S_OK;
197 int32_t rc = 0; 242 int32_t rc = 0;
198 LPCWSTR* rgPropertyKeys = NULL; 243 LPCWSTR* rgPropertyKeys = NULL;
199 LPCWSTR* rgPropertyValues = NULL; 244 LPCWSTR* rgPropertyValues = NULL;
diff --git a/src/dnchost/dncutil.h b/src/dnchost/dncutil.h
index 1a7c16e3..85eda3b2 100644
--- a/src/dnchost/dncutil.h
+++ b/src/dnchost/dncutil.h
@@ -14,6 +14,8 @@ struct HOSTFXR_STATE
14 hostfxr_get_runtime_properties_fn pfnHostfxrGetRuntimeProperties; 14 hostfxr_get_runtime_properties_fn pfnHostfxrGetRuntimeProperties;
15 hostfxr_set_error_writer_fn pfnHostfxrSetErrorWriter; 15 hostfxr_set_error_writer_fn pfnHostfxrSetErrorWriter;
16 hostfxr_close_fn pfnHostfxrClose; 16 hostfxr_close_fn pfnHostfxrClose;
17 hostfxr_get_runtime_delegate_fn pfnHostfxrGetRuntimeDelegate;
18 get_function_pointer_fn pfnGetFunctionPointer;
17 coreclr_initialize_ptr pfnCoreclrInitialize; 19 coreclr_initialize_ptr pfnCoreclrInitialize;
18 coreclr_create_delegate_ptr pfnCoreclrCreateDelegate; 20 coreclr_create_delegate_ptr pfnCoreclrCreateDelegate;
19 void* pClrHandle; 21 void* pClrHandle;
diff --git a/src/dnchost/precomp.h b/src/dnchost/precomp.h
index d19a0780..84ff6424 100644
--- a/src/dnchost/precomp.h
+++ b/src/dnchost/precomp.h
@@ -24,6 +24,7 @@
24#define NETHOST_USE_AS_STATIC 24#define NETHOST_USE_AS_STATIC
25#include <nethost.h> 25#include <nethost.h>
26#include <hostfxr.h> 26#include <hostfxr.h>
27#include <coreclr_delegates.h>
27 28
28#include "coreclrhost.h" 29#include "coreclrhost.h"
29#include "dncutil.h" 30#include "dncutil.h"