Решение сборки в памятиC#

Место общения программистов 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.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»