.Net 4 - Включить пользовательскую информацию в сборку - PullRequest
5 голосов
/ 15 июня 2011

Я создаю расширяемое приложение, которое будет загружать дополнительные сборки во время выполнения до Assembly.LoadFile(). Эти дополнительные сборки будут содержать такие вещи, как словари ресурсов WPF (оболочки и т. Д.), Простые ресурсы (Resx) и / или классы плагинов. Сборка также не может содержать общедоступных классов, только ресурсы или словари ресурсов.

Я ищу способ идентифицировать сборку, такие как понятное имя (например, «Дополнительные скины» или «Встроенный браузер»), функциональный тип сборки (SkinsLibrary, SkinsLibrary | PluginLibrary и т. Д.) И дополнительные информация (например, ConflictsWith (new [] {"SkinsLibrary", "BrowserPlugin").

Пока что я использую соглашение в именовании сборок (*.Skins.*.dll и т. Д.). В каждой сборке у меня есть пустой, фиктивный класс, который является просто заполнителем для пользовательских атрибутов класса, которые содержат фактическую (всю сборку) информацию, но это похоже на хак. Есть ли какой-то упрощенный, стандартный способ справиться с этим?

Я занимаюсь разработкой системы центрального загрузчика, и другие разработчики в моей команде разработают эти дополнительные сборки, поэтому я хотел бы свести к минимуму соглашения и детали подключения.

Ответы [ 4 ]

3 голосов
/ 15 июня 2011

РЕДАКТИРОВАТЬ: я обновил ответ с более подробной информацией.

Вот пример того, как вы можете выполнить то, что вы хотите сделать.
Начните с определения перечисления для различных типов плагинов.

public enum AssemblyPluginType
{
    Skins,
    Browser
}

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

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public sealed class AssemblyPluginAttribute : Attribute
{
    private readonly AssemblyPluginType _type;

    public AssemblyPluginType PluginType
    {
        get { return _type; }
    }

    public AssemblyPluginAttribute(AssemblyPluginType type)
    {
        _type = type;
    }
}

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public sealed class AssemblyPluginConflictAttribute : Attribute
{
    private readonly AssemblyPluginType[] _conflicts;

    public AssemblyPluginType[] Conflicts
    {
        get { return _conflicts; }
    } 

    public AssemblyPluginConflictAttribute(params AssemblyPluginType[] conflicts)
    {
        _conflicts = conflicts;
    }
}

Теперь вы можете добавить эти атрибуты в вашу сборку.

Следующие две строки могут быть добавлены в любом месте сборки, если они находятся вне пространства имен. Я обычно помещаю атрибуты сборки в файл AssemblyInfo.cs, который можно найти в папке Properties.

[assembly: AssemblyPluginAttribute(AssemblyPluginType.Browser)]
[assembly: AssemblyPluginConflictAttribute(AssemblyPluginType.Skins, AssemblyPluginType.Browser)]

Теперь вы можете использовать следующий код для проверки сборки на наличие определенных атрибутов:

using System;
using System.Reflection;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Get the assembly we're going to check for attributes.
            // You will want to load the assemblies you want to check at runtime.
            Assembly assembly = typeof(Program).Assembly;

            // Get all assembly plugin attributes that the assembly contains.
            object[] attributes = assembly.GetCustomAttributes(typeof(AssemblyPluginAttribute), false);
            if (attributes.Length == 1)
            {
                // Cast the attribute and get the assembly plugin type from it.
                var attribute = attributes[0] as AssemblyPluginAttribute;
                AssemblyPluginType pluginType = attribute.PluginType;
            }
        }
    }
}
2 голосов
/ 15 июня 2011

Я частично получаю информацию, но

вы можете добавить Настраиваемые атрибуты AssemblyInfo , которые вы можете увидеть, перейдя по ссылке ..

1 голос
/ 14 октября 2016

Вы можете использовать встроенный AssemblyMetadataAttribute класс ;доступно с .NET 4.5.

0 голосов
/ 15 июня 2011

Для плагинов у меня большой опыт работы с MvcTurbine (его можно использовать с другими проектами, не только с mvc).Если вы используете его в сочетании с Ninject и определяете интерфейс для плагина, т.е.в каталоге bin ваша реализация плагина будет добавлена ​​в список, который передается в конструктор некоторого класса, который использует DI и получает List, или вы можете разрешить его из контейнера IOC вручную.Это намного чище, чем загрузка ваших сборок вручную и проверка их на наличие интерфейсов / реализаций и т. Д. *

Если вы заинтересованы в этом, пожалуйста, спросите, если что-то неясно, и я уточню.

...