2013-03-12 1 views
3

Мое приложение имеет подключаемую структуру, в которой он загружает 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 
+0

Почему вы предоставляете оба варианта? Просто любопытно ... – Jobo

+0

Это в основном наследие в этот момент. Я хочу, чтобы иметь возможность загружать DLL из удаленных мест, и некоторые DLL-файлы требуют загрузки с диска по какой-либо причине. Я ищу, чтобы удалить это как вариант и просто решить, на основе каждой библиотеки, что лучше, но я хочу, чтобы мои разработчики контролировали происходящее. –

ответ

1

Рефлексивная загрузка по-прежнему загружает вещь, поэтому, как только вы это сделали, это уже слишком поздно, чтобы задать вопрос.

Один из вариантов - выполнить нагрузку только на отражение в отдельном AppDomain, а затем вернуть результат обратно в ваш основной код и выбросить новый AppDomain.

Альтернативой использованию атрибутов было бы попросить разработчиков плагинов включить какой-либо файл манифеста (например, текст или XML), который содержит любую информацию или параметры, которые вам нужны.