@@ -6151,7 +6151,7 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryFromPath(LPCWSTR libraryPath, BOOL thr
6151
6151
6152
6152
// static
6153
6153
NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryByName (LPCWSTR libraryName, Assembly *callingAssembly,
6154
- BOOL hasDllImportSearchFlag , DWORD dllImportSearchFlag ,
6154
+ BOOL hasDllImportSearchFlags , DWORD dllImportSearchFlags ,
6155
6155
BOOL throwOnError)
6156
6156
{
6157
6157
CONTRACTL
@@ -6164,15 +6164,15 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryByName(LPCWSTR libraryName, Assembly *
6164
6164
6165
6165
LoadLibErrorTracker errorTracker;
6166
6166
6167
- // First checks if a default DllImportSearchPathFlag was passed in, if so, use that value.
6167
+ // First checks if a default dllImportSearchPathFlags was passed in, if so, use that value.
6168
6168
// Otherwise checks if the assembly has the DefaultDllImportSearchPathsAttribute attribute. If so, use that value.
6169
6169
BOOL searchAssemblyDirectory = TRUE ;
6170
- DWORD dllImportSearchPathFlag = 0 ;
6170
+ DWORD dllImportSearchPathFlags = 0 ;
6171
6171
6172
- if (hasDllImportSearchFlag )
6172
+ if (hasDllImportSearchFlags )
6173
6173
{
6174
- dllImportSearchPathFlag = dllImportSearchFlag & ~DLLIMPORTSEARCHPATH_ASSEMBLYDIRECTORY;
6175
- searchAssemblyDirectory = dllImportSearchFlag & DLLIMPORTSEARCHPATH_ASSEMBLYDIRECTORY;
6174
+ dllImportSearchPathFlags = dllImportSearchFlags & ~DLLIMPORTSEARCHPATH_ASSEMBLYDIRECTORY;
6175
+ searchAssemblyDirectory = dllImportSearchFlags & DLLIMPORTSEARCHPATH_ASSEMBLYDIRECTORY;
6176
6176
6177
6177
}
6178
6178
else
@@ -6181,13 +6181,13 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryByName(LPCWSTR libraryName, Assembly *
6181
6181
6182
6182
if (pModule->HasDefaultDllImportSearchPathsAttribute ())
6183
6183
{
6184
- dllImportSearchPathFlag = pModule->DefaultDllImportSearchPathsAttributeCachedValue ();
6184
+ dllImportSearchPathFlags = pModule->DefaultDllImportSearchPathsAttributeCachedValue ();
6185
6185
searchAssemblyDirectory = pModule->DllImportSearchAssemblyDirectory ();
6186
6186
}
6187
6187
}
6188
6188
6189
6189
NATIVE_LIBRARY_HANDLE hmod =
6190
- LoadLibraryModuleBySearch (callingAssembly, searchAssemblyDirectory, dllImportSearchPathFlag , &errorTracker, libraryName);
6190
+ LoadLibraryModuleBySearch (callingAssembly, searchAssemblyDirectory, dllImportSearchPathFlags , &errorTracker, libraryName);
6191
6191
6192
6192
if (throwOnError && (hmod == nullptr ))
6193
6193
{
@@ -6206,11 +6206,11 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(NDirectMethodDesc * pMD
6206
6206
// First checks if the method has DefaultDllImportSearchPathsAttribute. If so, use that value.
6207
6207
// Otherwise checks if the assembly has the attribute. If so, use that value.
6208
6208
BOOL searchAssemblyDirectory = TRUE ;
6209
- DWORD dllImportSearchPathFlag = 0 ;
6209
+ DWORD dllImportSearchPathFlags = 0 ;
6210
6210
6211
6211
if (pMD->HasDefaultDllImportSearchPathsAttribute ())
6212
6212
{
6213
- dllImportSearchPathFlag = pMD->DefaultDllImportSearchPathsAttributeCachedValue ();
6213
+ dllImportSearchPathFlags = pMD->DefaultDllImportSearchPathsAttributeCachedValue ();
6214
6214
searchAssemblyDirectory = pMD->DllImportSearchAssemblyDirectory ();
6215
6215
}
6216
6216
else
@@ -6219,13 +6219,13 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(NDirectMethodDesc * pMD
6219
6219
6220
6220
if (pModule->HasDefaultDllImportSearchPathsAttribute ())
6221
6221
{
6222
- dllImportSearchPathFlag = pModule->DefaultDllImportSearchPathsAttributeCachedValue ();
6222
+ dllImportSearchPathFlags = pModule->DefaultDllImportSearchPathsAttributeCachedValue ();
6223
6223
searchAssemblyDirectory = pModule->DllImportSearchAssemblyDirectory ();
6224
6224
}
6225
6225
}
6226
6226
6227
6227
Assembly* pAssembly = pMD->GetMethodTable ()->GetAssembly ();
6228
- return LoadLibraryModuleBySearch (pAssembly, searchAssemblyDirectory, dllImportSearchPathFlag , pErrorTracker, wszLibName);
6228
+ return LoadLibraryModuleBySearch (pAssembly, searchAssemblyDirectory, dllImportSearchPathFlags , pErrorTracker, wszLibName);
6229
6229
}
6230
6230
6231
6231
// static
@@ -6274,6 +6274,17 @@ INT_PTR NDirect::GetNativeLibraryExport(NATIVE_LIBRARY_HANDLE handle, LPCWSTR sy
6274
6274
return address;
6275
6275
}
6276
6276
6277
+ #ifndef PLATFORM_UNIX
6278
+ BOOL IsWindowsAPISet (PCWSTR wszLibName)
6279
+ {
6280
+ STANDARD_VM_CONTRACT;
6281
+
6282
+ // This is replicating quick check from the OS implementation of api sets.
6283
+ return SString::_wcsnicmp (wszLibName, W (" api-" ), 4 ) == 0 ||
6284
+ SString::_wcsnicmp (wszLibName, W (" ext-" ), 4 ) == 0 ;
6285
+ }
6286
+ #endif // !PLATFORM_UNIX
6287
+
6277
6288
// static
6278
6289
NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleViaHost (NDirectMethodDesc * pMD, PCWSTR wszLibName)
6279
6290
{
@@ -6282,13 +6293,12 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleViaHost(NDirectMethodDesc * pMD,
6282
6293
// Check if we need to provide the host a chance to provide the unmanaged dll
6283
6294
6284
6295
#ifndef PLATFORM_UNIX
6285
- // Prevent Overriding of Windows API sets.
6286
- // This is replicating quick check from the OS implementation of api sets.
6287
- if (SString::_wcsnicmp (wszLibName, W (" api-" ), 4 ) == 0 || SString::_wcsnicmp (wszLibName, W (" ext-" ), 4 ) == 0 )
6296
+ if (IsWindowsAPISet (wszLibName))
6288
6297
{
6298
+ // Prevent Overriding of Windows API sets.
6289
6299
return NULL ;
6290
6300
}
6291
- #endif
6301
+ #endif // !PLATFORM_UNIX
6292
6302
6293
6303
NATIVE_LIBRARY_HANDLE hmod = NULL ;
6294
6304
AppDomain* pDomain = GetAppDomain ();
@@ -6438,6 +6448,49 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleViaEvent(NDirectMethodDesc * pMD
6438
6448
return hmod;
6439
6449
}
6440
6450
6451
+ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleViaCallback (NDirectMethodDesc * pMD, LPCWSTR wszLibName)
6452
+ {
6453
+ STANDARD_VM_CONTRACT;
6454
+
6455
+ NATIVE_LIBRARY_HANDLE handle = NULL ;
6456
+
6457
+ DWORD dllImportSearchPathFlags = 0 ;
6458
+ BOOL hasDllImportSearchPathFlags = pMD->HasDefaultDllImportSearchPathsAttribute ();
6459
+ if (hasDllImportSearchPathFlags)
6460
+ {
6461
+ dllImportSearchPathFlags = pMD->DefaultDllImportSearchPathsAttributeCachedValue ();
6462
+ if (pMD->DllImportSearchAssemblyDirectory ())
6463
+ dllImportSearchPathFlags |= DLLIMPORTSEARCHPATH_ASSEMBLYDIRECTORY;
6464
+ }
6465
+
6466
+ Assembly* pAssembly = pMD->GetMethodTable ()->GetAssembly ();
6467
+
6468
+ GCX_COOP ();
6469
+
6470
+ struct {
6471
+ STRINGREF libNameRef;
6472
+ OBJECTREF assemblyRef;
6473
+ } gc = { NULL , NULL };
6474
+
6475
+ GCPROTECT_BEGIN (gc);
6476
+
6477
+ gc.libNameRef = StringObject::NewString (wszLibName);
6478
+ gc.assemblyRef = pAssembly->GetExposedObject ();
6479
+
6480
+ PREPARE_NONVIRTUAL_CALLSITE (METHOD__NATIVELIBRARY__LOADLIBRARYCALLBACKSTUB);
6481
+ DECLARE_ARGHOLDER_ARRAY (args, 4 );
6482
+ args[ARGNUM_0] = STRINGREF_TO_ARGHOLDER (gc.libNameRef );
6483
+ args[ARGNUM_1] = OBJECTREF_TO_ARGHOLDER (gc.assemblyRef );
6484
+ args[ARGNUM_2] = BOOL_TO_ARGHOLDER (hasDllImportSearchPathFlags);
6485
+ args[ARGNUM_3] = DWORD_TO_ARGHOLDER (dllImportSearchPathFlags);
6486
+
6487
+ // Make the call
6488
+ CALL_MANAGED_METHOD (handle, NATIVE_LIBRARY_HANDLE, args);
6489
+ GCPROTECT_END ();
6490
+
6491
+ return handle;
6492
+ }
6493
+
6441
6494
// Try to load the module alongside the assembly where the PInvoke was declared.
6442
6495
NATIVE_LIBRARY_HANDLE NDirect::LoadFromPInvokeAssemblyDirectory (Assembly *pAssembly, LPCWSTR libName, DWORD flags, LoadLibErrorTracker *pErrorTracker)
6443
6496
{
@@ -6461,11 +6514,12 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadFromPInvokeAssemblyDirectory(Assembly *pAssem
6461
6514
}
6462
6515
6463
6516
// Try to load the module from the native DLL search directories
6464
- NATIVE_LIBRARY_HANDLE NDirect::LoadFromNativeDllSearchDirectories (AppDomain* pDomain, LPCWSTR libName, DWORD flags, LoadLibErrorTracker *pErrorTracker)
6517
+ NATIVE_LIBRARY_HANDLE NDirect::LoadFromNativeDllSearchDirectories (LPCWSTR libName, DWORD flags, LoadLibErrorTracker *pErrorTracker)
6465
6518
{
6466
6519
STANDARD_VM_CONTRACT;
6467
6520
6468
6521
NATIVE_LIBRARY_HANDLE hmod = NULL ;
6522
+ AppDomain* pDomain = GetAppDomain ();
6469
6523
6470
6524
if (pDomain->HasNativeDllSearchDirectories ())
6471
6525
{
@@ -6587,7 +6641,7 @@ static void DetermineLibNameVariations(const WCHAR** libNameVariations, int* num
6587
6641
// Search for the library and variants of its name in probing directories.
6588
6642
// static
6589
6643
NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch (Assembly *callingAssembly,
6590
- BOOL searchAssemblyDirectory, DWORD dllImportSearchPathFlag ,
6644
+ BOOL searchAssemblyDirectory, DWORD dllImportSearchPathFlags ,
6591
6645
LoadLibErrorTracker * pErrorTracker, LPCWSTR wszLibName)
6592
6646
{
6593
6647
STANDARD_VM_CONTRACT;
@@ -6597,7 +6651,7 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(Assembly *callingAssemb
6597
6651
#if defined(FEATURE_CORESYSTEM) && !defined(PLATFORM_UNIX)
6598
6652
// Try to go straight to System32 for Windows API sets. This is replicating quick check from
6599
6653
// the OS implementation of api sets.
6600
- if (SString::_wcsnicmp (wszLibName, W ( " api- " ), 4 ) == 0 || SString::_wcsnicmp (wszLibName, W ( " ext- " ), 4 ) == 0 )
6654
+ if (IsWindowsAPISet (wszLibName) )
6601
6655
{
6602
6656
hmod = LocalLoadLibraryHelper (wszLibName, LOAD_LIBRARY_SEARCH_SYSTEM32, pErrorTracker);
6603
6657
if (hmod != NULL )
@@ -6625,7 +6679,7 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(Assembly *callingAssemb
6625
6679
currLibNameVariation.Printf (prefixSuffixCombinations[i], PLATFORM_SHARED_LIB_PREFIX_W, wszLibName, PLATFORM_SHARED_LIB_SUFFIX_W);
6626
6680
6627
6681
// NATIVE_DLL_SEARCH_DIRECTORIES set by host is considered well known path
6628
- hmod = LoadFromNativeDllSearchDirectories (pDomain, currLibNameVariation, loadWithAlteredPathFlags, pErrorTracker);
6682
+ hmod = LoadFromNativeDllSearchDirectories (currLibNameVariation, loadWithAlteredPathFlags, pErrorTracker);
6629
6683
if (hmod != NULL )
6630
6684
{
6631
6685
return hmod;
@@ -6634,11 +6688,11 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(Assembly *callingAssemb
6634
6688
if (!libNameIsRelativePath)
6635
6689
{
6636
6690
DWORD flags = loadWithAlteredPathFlags;
6637
- if ((dllImportSearchPathFlag & LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR) != 0 )
6691
+ if ((dllImportSearchPathFlags & LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR) != 0 )
6638
6692
{
6639
6693
// LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR is the only flag affecting absolute path. Don't OR the flags
6640
6694
// unconditionally as all absolute path P/Invokes could then lose LOAD_WITH_ALTERED_SEARCH_PATH.
6641
- flags |= dllImportSearchPathFlag ;
6695
+ flags |= dllImportSearchPathFlags ;
6642
6696
}
6643
6697
6644
6698
hmod = LocalLoadLibraryHelper (currLibNameVariation, flags, pErrorTracker);
@@ -6649,14 +6703,14 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(Assembly *callingAssemb
6649
6703
}
6650
6704
else if ((callingAssembly != nullptr ) && searchAssemblyDirectory)
6651
6705
{
6652
- hmod = LoadFromPInvokeAssemblyDirectory (callingAssembly, currLibNameVariation, loadWithAlteredPathFlags | dllImportSearchPathFlag , pErrorTracker);
6706
+ hmod = LoadFromPInvokeAssemblyDirectory (callingAssembly, currLibNameVariation, loadWithAlteredPathFlags | dllImportSearchPathFlags , pErrorTracker);
6653
6707
if (hmod != NULL )
6654
6708
{
6655
6709
return hmod;
6656
6710
}
6657
6711
}
6658
6712
6659
- hmod = LocalLoadLibraryHelper (currLibNameVariation, dllImportSearchPathFlag , pErrorTracker);
6713
+ hmod = LocalLoadLibraryHelper (currLibNameVariation, dllImportSearchPathFlags , pErrorTracker);
6660
6714
if (hmod != NULL )
6661
6715
{
6662
6716
return hmod;
@@ -6686,7 +6740,7 @@ NATIVE_LIBRARY_HANDLE NDirect::LoadLibraryModuleBySearch(Assembly *callingAssemb
6686
6740
Assembly *pAssembly = spec.LoadAssembly (FILE_LOADED);
6687
6741
Module *pModule = pAssembly->FindModuleByName (szLibName);
6688
6742
6689
- hmod = LocalLoadLibraryHelper (pModule->GetPath (), loadWithAlteredPathFlags | dllImportSearchPathFlag , pErrorTracker);
6743
+ hmod = LocalLoadLibraryHelper (pModule->GetPath (), loadWithAlteredPathFlags | dllImportSearchPathFlags , pErrorTracker);
6690
6744
}
6691
6745
}
6692
6746
@@ -6707,11 +6761,19 @@ HINSTANCE NDirect::LoadLibraryModule(NDirectMethodDesc * pMD, LoadLibErrorTracke
6707
6761
if ( !name || !*name )
6708
6762
return NULL ;
6709
6763
6710
- ModuleHandleHolder hmod;
6711
6764
6712
6765
PREFIX_ASSUME ( name != NULL );
6713
6766
MAKE_WIDEPTR_FROMUTF8 ( wszLibName, name );
6714
6767
6768
+ ModuleHandleHolder hmod = LoadLibraryModuleViaCallback (pMD, wszLibName);
6769
+ if (hmod != NULL )
6770
+ {
6771
+ #ifdef FEATURE_PAL
6772
+ hmod = PAL_RegisterLibraryDirect (hmod, wszLibName);
6773
+ #endif // FEATURE_PAL
6774
+ return hmod.Extract ();
6775
+ }
6776
+
6715
6777
AppDomain* pDomain = GetAppDomain ();
6716
6778
6717
6779
// AssemblyLoadContext is not supported in AppX mode and thus,
0 commit comments