Существует вероятность того, что .NET Framework использует внутренне LOAD_WITH_ALTERED_SEARCH_PATH
, когда в конечном итоге выполняет вызов LoadLibrary
для сборки C ++ / CLI.
По крайней мере, я ясно вижу в своих стеках вызововчто фреймворк это с использованием LoadLibraryEx
внутри для загрузки смешанного режима cppcli.dll в процесс.
Сначала:
> cppnative1.dll!DllMain(HINSTANCE__ * hModule, unsigned long ul_reason_for_call, void * lpReserved) Line 13 C++ Symbols loaded.
cppnative1.dll!dllmain_dispatch(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 199 C++ Symbols loaded.
ntdll.dll!LdrpRunInitializeRoutines() Unknown Symbols loaded.
ntdll.dll!LdrpLoadDll() Unknown Symbols loaded.
ntdll.dll!LdrLoadDll() Unknown Symbols loaded.
KernelBase.dll!LoadLibraryExW() Unknown Symbols loaded.
[Managed to Native Transition] Annotated Frame
mscorlib.dll!System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity, System.Reflection.RuntimeAssembly reqAssembly, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool throwOnFileNotFound, bool forIntrospection, bool suppressSecurityChecks) Unknown No symbols loaded.
Затем:
> cppcli.dll!DllMain(HINSTANCE__ * hModule, unsigned long ul_reason_for_call, void * lpReserved) Line 17 C++ Symbols loaded.
cppcli.dll!dllmain_dispatch(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 199 C++ Symbols loaded.
mscoreei.dll!000007fef3ec0e64() Unknown No symbols loaded.
mscoree.dll!000007fef5fd3281() Unknown No symbols loaded.
mscoree.dll!000007fef5fd32cf() Unknown No symbols loaded.
ntdll.dll!LdrpRunInitializeRoutines() Unknown Symbols loaded.
ntdll.dll!LdrpLoadDll() Unknown Symbols loaded.
ntdll.dll!LdrLoadDll() Unknown Symbols loaded.
KernelBase.dll!LoadLibraryExW() Unknown Symbols loaded.
[Managed to Native Transition] Annotated Frame
mscorlib.dll!System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity, System.Reflection.RuntimeAssembly reqAssembly, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool throwOnFileNotFound, bool forIntrospection, bool suppressSecurityChecks) Unknown No symbols loaded.
Я также могу заметить, что исполняемый путь больше не ищется при разрешении зависимостей переходного (собственного) модуля во время этого вызова LoadLibraryEx
.
То есть всеНЕОБХОДИМО, чтобы транзитивные (собственные) зависимости находились в каталоге вызова LoadFrom
, а не в каталоге приложения.
(Между прочим, CWD "." ищется , поэтому его можно добавить впутаница, а также.)