РЕДАКТИРОВАТЬ: я обновил ответ с более подробной информацией.
Вот пример того, как вы можете выполнить то, что вы хотите сделать.
Начните с определения перечисления для различных типов плагинов.
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;
}
}
}
}