.Net 4 - 在程序集中包含自定义信息

2024-01-04

我正在构建一个可扩展的应用程序,它将在运行时加载其他程序集Assembly.LoadFile()。这些附加程序集将包含 WPF 资源字典(外观等)、普通资源 (Resx) 和/或插件类等内容。程序集也可以不包含公共类,只包含资源或资源字典。

我正在寻找一种识别程序集的方法,例如友好名称(如“附加皮肤”或“集成浏览器”)、程序集的功能类型(SkinsLibrary、SkinsLibrary|PluginLibrary 等)和附加信息(如ConflictsWith(new [] {"SkinsLibrary", "BrowserPlugin").

到目前为止,我在命名程序集时使用了约定(*.Skins.*.dll, ETC。)。在每个程序集中,我都有一个空的虚拟类,它只是自定义类属性的占位符,它保存实际的(程序集范围内的)信息,但这感觉就像一个黑客。有没有一些简化的、标准的方法来处理这个问题?

我正在开发中央加载程序系统,我团队中的其他开发人员将开发这些附加组件,因此我想尽量减少约定和管道细节。


编辑:我已经用一些更详细的信息更新了答案。

这是一个示例,您可以如何完成您想做的事情。
首先为不同类型的插件类型定义一个枚举。

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 folder.

[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;
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net 4 - 在程序集中包含自定义信息 的相关文章

随机推荐

  • 如何在Options和Into之间进行转换?

    我的项目中有一个结构A它在逻辑上与结构相关B来自不同的板条箱 两者内部都有一个可选的子结构 C D 假设对于这个例子 他们有这个结构定义 struct D name Option
  • PHP foreach 语句引用:重用迭代器时出现意外行为

    此代码产生意外的输出 array str split abcde foreach array as item echo item echo n foreach array as item echo item output abcde abc
  • 使用 stristr 在单个 if 条件中匹配数组中的任何值,无需多个运算符

    我在编写 PHP 代码时非常有能力 尽管我刚刚遇到了一种情况 我想知道是否可以使用stristr匹配 a 内数组中的任何值SINGLE如果条件 我不需要 想要一个类 一个专用函数或任何超级复杂的东西 我也没有做任何复杂的事情 例如尝试匹配特
  • 如何在没有动画的情况下执行展开转场?

    我如何在没有任何动画的情况下执行展开转场 我尝试设置一个展开转场 并在右侧的故事板中取消选中 动画 但它仍然是动画的 它向下滑动 我该如何解决这个问题 使用 Xcode 7 在 iOS 模拟器上运行 这可以按预期工作 只需在属性检查器中取消
  • 设置每个分支的拉取请求合并选项

    我的团队已经建立了一个 Github 工作流程 我们在其中压缩和合并针对开发分支的拉取请求 并重新调整和合并针对 master 的拉取请求 后者是为了保持跨部署的提交顺序 我可以从所有分支的 Github 设置中启用 挤压和合并 和 变基和
  • 如何查找 Tesseract OCR 配置文件中支持的参数

    我想知道Tesseract OCR使用的配置文件接受哪些参数 如何编写配置文件等 我在 上找不到任何关于此的文档他们的网站 https code google com p tesseract ocr 如何确定支持哪些参数及其含义 Tesse
  • 如何正确使用HTTP_X_FORWARDED_FOR?

    好的 我有一个小的身份验证问题 我的 Web 服务允许使用用户名和密码通过 HTTP 连接到我的 API 但此连接也可以限制为特定的 IP 地址 这意味着 SERVER REMOTE ADDR 可能是不正确的 我已经知道任何 IP 信息永远
  • 如何在 iOS 中从 MTKView 制作屏幕截图图像?

    我指的是金属套件必需品 https developer apple com metal 并通过以下方式制作模型查看器应用程序MetalKit in iOS 9 1 我想制作屏幕截图图像 RGBA 格式 MTKView 但是 我只得到黑色图像
  • 使用storm时如何将拓扑上下文中的对象访问到bolt中?

    我们在创建拓扑时需要传递一个对象 以便 Bolt 可以访问该对象并基于该对象进行一些进一步的处理 是否可以通过传递对象TopplogyContext如果是 怎么办 或者是否有其他方法可以在提交拓扑时传递对象 然后再提交 以便 Bolt 可以
  • 以编程方式更改 Xib 方向的最佳方法

    我有一个应用程序 它有一个设置页面 用户可以在其中更改应用程序的语言 最终 xibs的方向将会改变 解释一下 例如 如果语言是英语 则方向将为 LTR 但如果是阿拉伯语 则为 RTL Question 实现这一目标的最佳方法是什么 尝试解决
  • C# 中的正则表达式负向前瞻

    我需要匹配 this 但不是 this 我有这个代码 Match match Regex Match result RegexOptions IgnoreCase while match Success MessageBox Show ma
  • 如何使用代码更改组合框的边框颜色?

    我有一个组合框 我想将边框的颜色更改为红色以将其标记为必填字段 我正在通过我的代码动态生成此组合框列 为了更改边框颜色 我应该设置哪些属性 DataGridTemplateColumn dataGridComboBoxTemplateCol
  • 无法通过 PowerShell 将角色添加到 Azure 应用程序注册

    我正在使用 Powershell 将角色添加到 Azure 中的现有应用程序注册 我正在使用这个命令 Set AzureADApplication ObjectId myApp ObjectId AppRoles newAppRoles n
  • Pico 容器异常:org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependencyException:?

    我似乎遇到了 pico 容器异常 org picocontainer injectors AbstractInjector UnsatisfiableDependencyException 我的代码如下 代表网站特定页面的页面对象 publ
  • Linux 上的集群与lockf

    If lockf与 0 偏移量一起使用 两者之间有什么区别flock and lockf当在独占模式下使用时 如果有的话 我这么问是因为我正在阅读根据平台有条件地在这两个函数中进行编译的代码 并且我想了解可能的原因 之间的实际区别flock
  • 在 QTabWidget 中动态设置单个选项卡的样式

    如何单独 动态地访问单个选项卡 不是其内容或选项卡中的小部件 以实现样式目的 例如更改背景颜色或向其添加图形效果 应用程序可以通过让选项卡以另一种颜色闪烁来通知用户该选项卡需要他们的注意 就像在 Windows 任务栏中 如果窗口想要获得焦
  • Vue路由器不渲染/挂载根路径组件

    我正在制作一个页面vue vue router and laravel 问题 当我进入localhost myproject public html the Home组件未渲染在router view 如果我单击指向服务组件的路由器链接 它
  • 如何正确钳位贝克曼分布

    我正在尝试实现 Microfacet BRDF 着色模型 类似于 Cook Torrance 模型 但我在使用本文中定义的贝克曼分布时遇到了一些问题 https www cs cornell edu srm publications EGS
  • 如何运行快捷方式

    我想知道从另一个应用程序中运行应用程序快捷方式的 官方 方式是什么 像这样 string program application exe Process Start program 这不会工作 如果application exe是一条捷径
  • .Net 4 - 在程序集中包含自定义信息

    我正在构建一个可扩展的应用程序 它将在运行时加载其他程序集Assembly LoadFile 这些附加程序集将包含 WPF 资源字典 外观等 普通资源 Resx 和 或插件类等内容 程序集也可以不包含公共类 只包含资源或资源字典 我正在寻找