Решение сборки в памяти ⇐ C#
-
Гость
Решение сборки в памяти
У меня есть входная сборка, которая полностью выполняется в памяти. Сборка записи создает новый домен, а затем пытается подключить преобразователь сборки. Это приводит к возникновению исключения FileNotFoundException в новом домене приложения, поскольку метод OnResolveAssembly расположен во входной сборке (в памяти), а среда CLR проверяет диск в поисках его.< /п> Входная сборка:
с использованием системы; использование System.Reflection; Программа общественного класса { общественная статическая пустота Main() { var newDomain = AppDomain.CreateDomain("новый-домен"); попробуйте {newDomain.AssemblyResolve += OnResolveAssembly; } catch (Исключение е) { Console.WriteLine(e); } } общедоступная статическая сборка OnResolveAssembly (отправитель объекта, аргументы ResolveEventArgs) { // загружаем необходимую dll из потока ресурсов вернуть ноль; } } Публикация и предоставление сборки записи:
публикация в dotnet
python -m http.server -d .\bin\Debug\net48\publish\
Запуск сборки ввода в памяти через Powershell:
[System.Reflection.Assembly]::Load((Invoke-WebRequest "http://127.0.0.1:8000/test.exe").Content).EntryPoint.Invoke($null, $null ) Ошибка:
System.IO.FileNotFoundException: не удалось загрузить файл или сборку «test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null» или одну из его зависимостей. Система не может найти указанный файл. Имя файла: «тест, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null». at System.Reflection.RuntimeAssembly._nLoad (имя сборки fileName, строка codeBase, доказательство сборкиSecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое значение throwOnFileNotFound, логическое значение forIntrospection, логическое значение compressSecurityChecks) в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName сборкаRef, Evidence AssemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое значение throwOnFileNotFound, логическое значение forIntrospection, логическое значение compressSecurityChecks) в System.Reflection.RuntimeAssembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое значение forIntrospection) в System.Reflection.RuntimeAssembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) в System.Reflection.Assembly.Load(String AssemblyString) в System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString (String AssemblyName) в System.Reflection.MemberInfoSerializationHolder..ctor (информация SerializationInfo, контекст StreamingContext) в System.AppDomain.add_AssemblyResolve (значение ResolveEventHandler) в Program.Main() Это была бы оскорбительная строка:
в System.Reflection.Assembly.Load(String AssemblyString)
Та же ошибка произойдет, если я попытаюсь создать общий прокси-объект, поскольку применяется тот же процесс при загрузке содержащей сборки в новый домен:
var proxy = (Proxy) Domain.CreateInstanceAndUnwrap(typeof(Proxy).Assembly.FullName, typeof(Proxy).FullName); Я попытался вручную загрузить сборки в новый домен, и хотя он показывает, что они загружены, я не могу ничего с ними сделать из-за отсутствия общего прокси-объекта между доменами.
Конечно, существует способ запустить двоичный файл C# полностью в памяти, сохранив при этом возможность использовать AppDomain.
У меня есть входная сборка, которая полностью выполняется в памяти. Сборка записи создает новый домен, а затем пытается подключить преобразователь сборки. Это приводит к возникновению исключения FileNotFoundException в новом домене приложения, поскольку метод OnResolveAssembly расположен во входной сборке (в памяти), а среда CLR проверяет диск в поисках его.< /п> Входная сборка:
с использованием системы; использование System.Reflection; Программа общественного класса { общественная статическая пустота Main() { var newDomain = AppDomain.CreateDomain("новый-домен"); попробуйте {newDomain.AssemblyResolve += OnResolveAssembly; } catch (Исключение е) { Console.WriteLine(e); } } общедоступная статическая сборка OnResolveAssembly (отправитель объекта, аргументы ResolveEventArgs) { // загружаем необходимую dll из потока ресурсов вернуть ноль; } } Публикация и предоставление сборки записи:
публикация в dotnet
python -m http.server -d .\bin\Debug\net48\publish\
Запуск сборки ввода в памяти через Powershell:
[System.Reflection.Assembly]::Load((Invoke-WebRequest "http://127.0.0.1:8000/test.exe").Content).EntryPoint.Invoke($null, $null ) Ошибка:
System.IO.FileNotFoundException: не удалось загрузить файл или сборку «test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null» или одну из его зависимостей. Система не может найти указанный файл. Имя файла: «тест, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null». at System.Reflection.RuntimeAssembly._nLoad (имя сборки fileName, строка codeBase, доказательство сборкиSecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое значение throwOnFileNotFound, логическое значение forIntrospection, логическое значение compressSecurityChecks) в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName сборкаRef, Evidence AssemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое значение throwOnFileNotFound, логическое значение forIntrospection, логическое значение compressSecurityChecks) в System.Reflection.RuntimeAssembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, логическое значение forIntrospection) в System.Reflection.RuntimeAssembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) в System.Reflection.Assembly.Load(String AssemblyString) в System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString (String AssemblyName) в System.Reflection.MemberInfoSerializationHolder..ctor (информация SerializationInfo, контекст StreamingContext) в System.AppDomain.add_AssemblyResolve (значение ResolveEventHandler) в Program.Main() Это была бы оскорбительная строка:
в System.Reflection.Assembly.Load(String AssemblyString)
Та же ошибка произойдет, если я попытаюсь создать общий прокси-объект, поскольку применяется тот же процесс при загрузке содержащей сборки в новый домен:
var proxy = (Proxy) Domain.CreateInstanceAndUnwrap(typeof(Proxy).Assembly.FullName, typeof(Proxy).FullName); Я попытался вручную загрузить сборки в новый домен, и хотя он показывает, что они загружены, я не могу ничего с ними сделать из-за отсутствия общего прокси-объекта между доменами.
Конечно, существует способ запустить двоичный файл C# полностью в памяти, сохранив при этом возможность использовать AppDomain.
Мобильная версия