Createinstance() - 我这样做对吗?

2024-01-19

我正在尝试将插件系统与.NET 组合在一起,但我不确定我是否做得正确。系统的基础是特定的目录({apppath}/Plugins/)将有一堆预编译的DLL,我想用反射来查看每个DLL,以及每个可用的类,如果它继承了特定的基类(这是在另一个 DLL 中定义的,但我稍后会详细介绍),然后创建它的一个实例并调用该实例中的特定函数。

Public Sub ScanPluginsInDirectory(ByVal Directory As String)

    Dim Plugins As New IO.DirectoryInfo(Directory)
    Dim Files As IO.FileInfo() = Plugins.GetFiles("*.dll")
    Dim CryptType As Type = GetType(CryptPluginBase)
    Dim PluginsData as List(Of LoadedPluginsInfo)

    For Each DllFile As IO.FileInfo In Files
        Try
            Dim thisAsm As Assembly = Assembly.LoadFrom(DllFile.FullName)
            Dim ClassDefs = thisAsm.GetTypes().Where(Function(type) CryptType.IsAssignableFrom(type))

            For Each ClassDef As Type In ClassDefs
                Dim A As Object
                A = ClassDef.Assembly.CreateInstance(ClassDef.Name)
                PluginsData.Add(New LoadedPluginsInfo(A.Plugin(), False))
            Next
        Catch ex As Exception
            Continue For
        End Try
    Next
End Sub

我遇到的具体问题是,我不确定这是正确的方法。如果可以假设,我尝试做的方法是否有效A.Plugin()实际上存在并且此处引用的任何结构和类都没有错误吗?如果有人需要更多代码来提供帮助,我可以发布它。


总体而言,该策略应该有效。 Assembly.LoadFrom 调用会将目标程序集加载到进程中。从那里可以进行类型检查并创建这些类型的实例。

我认为创建实例最简单、最可靠的方法是使用 Activator.CreateInstance 方法。

For Each def As Type in ClassDefs
  Dim inst = Activator.CreateInstance(def)
  PluginsData.Add(new LoadedPluginsInfo(inst.Plugin(), False))
Next

根据您的目标,另一个建议是将 Try/Catch 块移入循环而不是移出循环。将 Try/Catch 块放在循环外部意味着如果程序集中的任何给定类型确实有错误,您将丢弃该程序集中的所有类型。将其移入内部将允许您仅丢弃不能按预期工作的类型。d 不过,当前的行为可能是您的意图。

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

Createinstance() - 我这样做对吗? 的相关文章

  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 有没有一种简单的方法来使用InternalsVisibleToAttribute?

    我有一个 C 项目和一个测试项目 其中包含主项目的单元测试 我想要可测试的internal方法 我想在没有 Visual Studio 测试项目中可以拥有的神奇 Accessor 对象的情况下测试它们 我想用InternalsVisible
  • 使用 F5 时,finally 似乎没有在 C# 控制台应用程序中执行

    int i 0 try int j 10 i catch IOException e finally Console WriteLine In finally Console ReadLine 在VS2008中按F5时 finally块似乎
  • 即使在 GC Collect 和 WaitForPendingFinalizers 之后,窗口对象在关闭后也未释放?

    这是一个简单的测试应用程序 可帮助了解 WPF 内存使用情况 我想了解的关键是为什么MainWindow即使在关闭并等待 GC 完成之后 仍然被引用并且它的内存没有被释放 参见下面的代码清单 文本 MainWindow Finalizer
  • 在调试模式下单步执行时跳过方法的属性

    是否有一个属性可以在方法上使用 以便在调试模式下单步执行某些代码时 调试器保持在方法的外部 DebuggerStepThrough docs https learn microsoft com en us dotnet api system
  • System.Drawing.Image.Save 抛出ExternalException:GDI 中发生一般错误

    我有一个函数 它需要一个位图 复制它的一部分并将其保存为 8bpp tiff 结果图像的文件名是唯一的并且文件不存在 程序有权写入目标文件夹 void CropImage Bitmap map Bitmap croped new Bitma
  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 实用程序库中应包含哪些内容[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着我的项目越来越多 我发现我经常从一个项目到另一个项目 从一个客户到另一个客户重复许多常见的任务 因此 我开始组装一个 实用程序 库 这是这些
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • EasyNetQ 模型关闭

    我使用 EasyNetQ 实现了一个简单的 RabbitMQ 客户端 连接后 我收到一条通知 队列模型关闭 这是我的代码 var bus RabbitHutch CreateBus String Format host 0 hostName
  • C# 反射属性顺序

    我正在使用代码https stackoverflow com a 531388 528131 https stackoverflow com a 531388 528131要成功地从基类中检索对象实例的所有属性 问题在于首先要迭代派生类型的
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 随机数但不重复

    我想生成一个小于 50 的随机数 但一旦生成该数字 我希望它不能再次生成 谢谢您的帮助 请参见 费舍尔 耶茨洗牌 http en wikipedia org wiki Fisher E2 80 93Yates shuffle public
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org

随机推荐

  • 使用多个不同的 group_by 变量 (dplyr) 来总结数据帧

    我有一个数据框 my data 其中包含 6 列 group1 members group2 members group3 members price price 2 price 3 1 1 1 800 877 334 1 2 1 850
  • 角度模块中的多个配置块

    我需要在加载之前解决应用程序中的一些依赖项 为我的服务获取数据等 我想将它们分开 以便我为主应用程序拥有一个配置块 然后为应用程序的其他部分拥有一个或多个配置块 最终 我希望它能够解决主应用程序的依赖关系 加载与之关联的组件 然后解决其余部
  • 使用动态内容调整 fancybox 的大小

    我正在使用 fancybox 当盒子加载时 我需要将一些项目插入盒子内的无序列表 ul 中 问题是 当我插入项目时 内容比框本身大 因此我需要在内容更新后调整框的大小 我无法让它与 fancybox resize 一起使用 添加新内容后如何
  • 在 virtualenv 中编译 mod_wsgi 时出现问题

    我正在尝试在 CentOS 服务器上编译 mod wsgi 版本 3 3 Python 2 6 但在virtualenv 没有成功 我收到错误 usr bin ld home python26 lib libpython2 6 a node
  • Java 图像未显示?

    尝试显示我的徽标时遇到问题 图片保存在与main java同一个文件夹中 ImageIcon im new ImageIcon banner png JLabel bam new JLabel im grid add bam 我的语法有问题
  • 选择所有列,但用 Google BigQuery 中的表达式替换一些列?

    如同在 Google BigQuery 中选择除某些列之外的所有列 https stackoverflow com questions 34056485 select all columns except some in google bi
  • PHPUnit 测试速度慢

    我正在运行 PHPUnit 来使用 CIUnit 两者之间的第三方接口 测试 CodeIgniter 应用程序 许多测试从空的 MySQL 数据库中选择数据 该数据库在 setUp 中填充了 5 10 条记录 在 Windows 和 Web
  • 计算屏幕上显示的列表项目并且不溢出

    当溢出设置为隐藏时 如何统计屏幕上显示的所有列表项 使用下面的代码仍然会计算所有项目 甚至是溢出的项目 var count myList ul li visible length Fiddle http jsfiddle net kPAwX
  • Java ProcessBuilder 显示启动的 java 应用程序的控制台?

    我有一个 JAVA 应用程序 它启动 使用 ProcessBuilder 另一个 JAVA 应用程序 如下所示 String val something ProcessBuilder processBuilder new ProcessBu
  • CoordinatorLayout 内 ViewPager 中的非滚动片段

    我在活动的 CoordinatorLayout 来自最新版本的设计库 中使用 ViewPager 此 ViewPager 的某些片段具有 RecyclerView 或 NestedScrollView 等布局 但有些片段由于内容较小而无法滚
  • 休眠注释。 @Where 与 @WhereJoinTable

    遵循java文档 Where 用于添加到集合的元素 Entity 或目标实体的Where 子句 该子句是用 SQL 编写的 这里的一个常见用例是软删除 WhereJoinTable 添加到集合连接表的Where 子句 该子句是用 SQL 编
  • MacOS:无法运行 MySQL Workbench

    我一直在尝试在我的上运行MySQL工作台macOS Catalina 10 15 2很长一段时间了 我一直在 CLI 中使用 MySQL 但最近当我尝试切换到工作台时 出现了一些问题启动工作台应用程序时出现问题 MySQL服务器从 CLI
  • 标记扩展“StaticResourceExtension”要求在 ProvideValue 的 IServiceProvider 中实现“IXamlSchemaContextProvider”

    我已经使用了几年的资源扩展现在在新的 Net 4 项目的设计时停止工作 并出现以下错误 标记扩展 StaticResourceExtension 要求在 ProvideValue 的 IServiceProvider 中实现 IXamlSc
  • UITableViewCell 内的 UIView 动画

    我正在开发一个 iOS 应用程序 该应用程序在一个视图中具有UITableView有两个定制UITableViewCell 所有这些都使用主故事板 一切都很好 但我需要实现的是一个单一的淡入 淡出动画UIView from just one
  • 让VS2008“树形缩进”部分类(如代码隐藏文件)

    我创建了一个多平台项目 除了一些小事情之外 一切都运行良好 当我添加特定的平台文件时 例如 ServiceImpl cs ServiceImpl Desktop cs 它并没有像本文中那样以树形方式很好地显示 多目标 http www mo
  • 导入的表没有显示在 phpmyadmin [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我导出了生
  • Clang vs GCC vs MSVC 模板转换运算符 - 哪个编译器是正确的?

    我有带有转换运算符的简单代码 似乎所有编译器都给出了不同的结果 我很好奇哪个编译器 如果有 是正确的 我也尝试了不同的组合 但以下组合是最有趣的 代码是使用 C 11 标志编译的 但在 C 03 中也可能会观察到相同的行为 include
  • 如何将文件放入回收站而不是删除?

    当然是编程解决方案 http www daveamenta com 2008 05 c delete a file to the recycle bin http www daveamenta com 2008 05 c delete a
  • 在vite中,有没有办法从index.html更新根html名称

    我正在尝试将现有项目更新为 vite 但我在文档中读到 Vite 需要一个 index html 文件来工作 是否有指定 vite 应该构建的另一个文件名 就我而言 main html 入口点配置在build rollupOptions i
  • Createinstance() - 我这样做对吗?

    我正在尝试将插件系统与 NET 组合在一起 但我不确定我是否做得正确 系统的基础是特定的目录 apppath Plugins 将有一堆预编译的DLL 我想用反射来查看每个DLL 以及每个可用的类 如果它继承了特定的基类 这是在另一个 DLL