Мое приложение имеет подключаемую структуру, в которой он загружает DLL (стандартные сборки сборок .NET) в качестве плагинов. У меня есть широкий выбор приложений для загрузки этих DLL непосредственно с диска (Assembly.LoadFrom(file)
) или для копирования dll в память сначала, а затем загрузки из байтового массива (Assembly.Load(IO.File.ReadAllBytes(file))
).Получение информации с сборки без ее загрузки
Я хочу добавить опцию для разработчиков плагинов, чтобы выбрать, хотят ли они принудительно выполнять определенное поведение загрузки. Я думал, что я буду использовать AssemblyAttributes для этого, а затем ReflectionOnly загрузит DLL, чтобы узнать, определен ли атрибут. Однако я не смог получить эту информацию с помощью GetCustomAttributesData, потому что dll зависят от других сборок, которые не были полностью загружены. Теперь я нахожусь в кафкесской игре бит-моль.
Что было бы хорошим способом для разработчиков плагинов взаимодействовать с моим приложением до того, как их библиотеки будут загружены по-настоящему? Есть AssemblyAttributes путь, и, если да, то как я могу убедиться, что reponlyly загрузки никогда не терпит неудачу?
EDIT:
я ссылается Mono.Cecil перебрать атрибуты сборки. В первый раз, когда я использовал Сесил, надеюсь, что я все сделаю правильно. Начальные тесты на моей машине-разработчике, похоже, работают.
Private Function ExtractAssemblyLoadBehaviour(ByVal file As String) As GH_LoadingBehaviour
Try
If (Not IO.File.Exists(file)) Then Return GH_LoadingBehaviour.ApplicationDefault
Dim assembly As AssemblyDefinition = AssemblyDefinition.ReadAssembly(file)
If (assembly Is Nothing) Then Return GH_LoadingBehaviour.ApplicationDefault
Dim attributes As Collection(Of CustomAttribute) = assembly.CustomAttributes
If (attributes Is Nothing) Then Return GH_LoadingBehaviour.ApplicationDefault
For Each Attribute As CustomAttribute In attributes
Dim type As TypeReference = Attribute.AttributeType
If (type.FullName.Contains("GH_CoffLoadingAttribute")) Then Return GH_LoadingBehaviour.ForceCOFF
If (type.FullName.Contains("GH_DirectLoadingAttribute")) Then Return GH_LoadingBehaviour.ForceDirect
Next
Return GH_LoadingBehaviour.ApplicationDefault
Catch ex As Exception
Return GH_LoadingBehaviour.ApplicationDefault
End Try
End Function
Почему вы предоставляете оба варианта? Просто любопытно ... – Jobo
Это в основном наследие в этот момент. Я хочу, чтобы иметь возможность загружать DLL из удаленных мест, и некоторые DLL-файлы требуют загрузки с диска по какой-либо причине. Я ищу, чтобы удалить это как вариант и просто решить, на основе каждой библиотеки, что лучше, но я хочу, чтобы мои разработчики контролировали происходящее. –