C# 反射 - 如何在运行时重新加载类?

2023-12-05

目前我正在开发一个 C# 项目,我必须在其中实现反射。我创建了一个带有 GUI 的 WPF 应用程序。该 GUI 包含一个 组合框,其中包含实现特定接口的所有类名。具有显示的类名的类位于同一解决方案中。 组合框旁边有一个按钮,用于刷新组合框中的内容。但是,当我运行我的应用程序时,修改实现该接口的类名,并且 单击该刷新按钮,更改不会显示在组合框中。例如,当我更改类名时,它应该显示新的类名而不是旧的类名。

我已经提取了项目的这一部分,以便在空控制台应用程序中对其进行测试。这里我有一个由类实现的接口 快速排序算法、动态排序算法和合并排序算法。接下来,我在主类中编写了以下直接代码。

    public static List<string> AlgoList = new List<string>();

    static void Main(string[] args) {
        RefreshAlgorithms();
        Print();

        Console.WriteLine("\nChange a classname and press a key \n");
        Console.ReadKey();

        Print();

        Console.WriteLine("\nPress a key to exit the program \n");
        Console.ReadKey();
    }

    private static void RefreshAlgorithms() {
        AlgoList.Clear();
        Type AlgorithmTypes = typeof(IAlgorithms);
        foreach (var type in Assembly.GetCallingAssembly().GetTypes()) {
            if (AlgorithmTypes.IsAssignableFrom(type) && (type != AlgorithmTypes)) {
                AlgoList.Add(type.Name);
            }
        }
    }

    private static void Print() {
        Console.WriteLine("Algorithm classes:");
        foreach (var Algo in AlgoList) {
            Console.WriteLine(Algo);
        }
    }

当我运行应用程序时,会看到打印的类名 QuickSortAlgorithm、DynamicSortAlgorithm 和 MergeSortAlgorithm。但是,如果我更改名称,例如, QuickSortAlgorithm 类到 QuickSortAlgorithmmmmm 我希望一旦按下某个键它就会打印 QuickSortAlgorithmmmm。然而事实并非如此,名字也并非如此 QuickSortAlgorithm 仍在显示。

我感觉我忽略了反思概念中的一些东西。构建解决方案后还可以这样做吗?如果我理解正确的话,这个概念使得在运行时实现更改成为可能。我知道 它会使我的应用程序变慢,但我真的很渴望了解更多有关这个概念的信息。如果有人能解释我做错了什么,我会很高兴。


不幸的是,这不起作用。当您的程序集被加载时,它将保持原样加载,更改仅在您重新启动应用程序时应用。

如果您使用 .NET Framework,您可以创建一个新的 AppDomain 并将程序集加载到此 AppDomain 中。完成后,您可以卸载 AppDomain 及其程序集。您可以在正在运行的应用程序中多次执行此操作。

void RefreshAlgorithms()
{
    var appDomain = AppDomain.CreateDomain("TempDomain");
    appDomain.Load(YourAssembly);
    appDomain.DoCallback(Inspect);
    AppDomain.Unload(appDomain);
}

void Inspect()
{
    // This runs in the new appdomain where you can inspect your classes
}

但要小心,因为使用 AppDomains 有一些注意事项,例如与 AppDomain 通信时需要使用远程处理。

据我所知,在.NET Core中没有这样的方法可用

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

C# 反射 - 如何在运行时重新加载类? 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 如何使用 LINQ to Objects 安排作业而不重叠?

    这是另一个资源分配问题 我的目标是运行一个查询 将任何时隙的最高优先级作业分配给两个 CPU 核心之一 只是一个示例 所以我们假设没有中断或多任务处理 注意 这类似于我之前关于分区的文章 但重点关注重叠时间和分配多个项目 而不仅仅是最优先的
  • 删除 ng-bind-html-unsafe 后,如何注入 HTML?

    我正在尝试使用 sanitize提供者和ng bind htm unsafe指令允许我的控制器将 HTML 注入到 DIV 中 但是 我无法让它工作 div div 我发现这是因为它已从 AngularJS 中删除 谢谢 但没有ng bin
  • 紧密循环中虚拟函数的成本

    我所处的情况是 我的游戏对象具有虚拟函数 Update 有很多游戏对象 目前略多于 7000 个 并且循环调用所有这些对象的更新 除其他外 我的同事建议我们应该完全删除虚函数 正如您可以想象的那样 这将需要大量的重构 我见过这个答案但就我而
  • 有没有办法抑制 Firebase Functions Firestore 触发器?

    我在用聚合用于跟踪 Firestore 中聚合数据 例如文档总数等 的技术 每当article创建或删除文档时 我正在使用 Firebase 函数的触发器来更新单独文档中的聚合数据 exports onCreateArticle funct
  • Python Minidom XML 查询

    我正在尝试使用 lxml 查询此 XML
  • python: ctypes,在 python 中读取 POINTER(c_char)

    我有一个 ctypes 字段 它是POINTER c char 根据文档 c char p 必须对我的应用程序不起作用 https docs python org 3 7 library ctypes html ctypes c char
  • MASM:如何解决8086编程中的立即模式非法?

    我正在解决一个基本问题汇编语言编程添加 BCD 数字和两个 ASCII 数字 为此我必须使用DAA 和 AAA现在我尝试将 AX 寄存器中存储的结果存储到我想要的内存位置 但没有明白为什么以下代码给我错误立即模式 非法下面是我到目前为止编写
  • 批处理文件决定 4 > 39,我该如何修复它?

    注意 文件 Default txt 包含一行包含以下三个字符的内容 1 X echo off set r 0 For loop retrieves lines of text from the file Default txt FOR F
  • Cocoa 应用程序的语法着色

    我计划做一个 Cocoa 应用程序 需要对代码语法进行着色 在所有常见语言中 是否有任何预制的解决方案可用 而不是编写自己的代码荧光笔 解析器 Thanks 你也许可以使用类似的东西Geshi 但这里还列出了资源 http www coco
  • 如何修复错误 org.testng.eclipse.maven.MavenTestNGLaunchConfigurationProvider.getClasspath(Lorg/eclipse/debug/core/ILaunchConfiguration

    我编写了一个代码 它只打开一个网页并验证页面的标题是否与预期的字符串匹配 import org openqa selenium WebDriver import org openqa selenium chrome ChromeDriver
  • WatchKit UIPageControl 点颜色

    当我在看其中一部的时候来自苹果的视频关于 Apple Watch 及其功能 我注意到页面指示器点的颜色会根据所显示的页面而变化 他们还获得了彩色圆点的图像Apple Watch 人机界面指南 应用程序剖析部分 还要注意彩色标题文本 通常在W
  • iPad(横向)媒体查询也适用于 Samsung Galaxy Tab 2(横向)

    我正在测试我的网络应用程序iPad 1 2 也三星 Tab 2 我有不同的 CSS 集 external 适用于 iPad 上的横向 纵向模式和选项卡 2 上的横向 纵向模式 但我无法为选项卡 2 编写正确的媒体查询 与我的喜好相反 应用于
  • Azure Web 应用程序的 Github 操作:无法从发布配置文件中获取凭据

    我在通过 GitHub Actions 将 Azure WebApp 部署到 Azure 时收到上面屏幕截图中的错误 我多次尝试断开和连接 WebApp 任何帮助表示赞赏 转到 Azure 门户中的 WebApp 并下载发布配置文件 您将获
  • mvc-mini-profiler 1.9 出现“无法确定提供程序名称”错误

    我正在使用带有 mvc mini profiler 的实体框架 从 mvc mini profiler 1 7 升级到版本 1 9 后解决一些问题 我成功编译了我的项目 现在我收到以下运行时异常 无法确定 MvcMiniProfiler D
  • 如何使用 Firebase 添加 Facebook 登录范围

    我正在尝试添加范围并访问来自 Facebook 的登录用户的更多属性 然而 Firebase 3 sdk 似乎对此并不清楚 provider new firebase auth FacebookAuthProvider provider a
  • Android:带有 AlarmManager 和 Service 的 AsyncTask

    我想每 60 秒定期将带有 HttpURLConnection api 的 JSON 字符串发布到本地主机服务器 WAMP 以插入数据库中 因此 我从计时器方法执行 MyAsyncTask 在 AlarmManager 和 Service
  • 在 PHP 中初始化静态变量

    取自PHP手册 与任何其他 PHP 静态变量一样 静态属性只能是 使用文字或常量初始化 不允许使用表达式 因此 虽然您可以将静态属性初始化为整数或数组 例如 您不能将其初始化为另一个变量 例如 函数返回值 或者一个对象 所以这意味着我不能执
  • 体系结构 i386 的未定义符号 - Lipo 错误?

    我已经为i386和armv7编译了libclang a 我可以使用 i386 libclang so 构建我的 ios 应用程序 但它无法启动 因为 dylib 未找到 错误 然后我决定使用 lipo 创建 fat lib lipo cre
  • 逻辑运算符与按位运算符的区别是什么

    鉴于此语句是一个逻辑运算 a gt 5 b gt 4 这个语句是按位运算 a gt 5 b gt 4 以上两种说法并不等价 Because a gt 5 是一个元素 0 1 那么 为什么我们需要logical operators bitwi
  • C# 反射 - 如何在运行时重新加载类?

    目前我正在开发一个 C 项目 我必须在其中实现反射 我创建了一个带有 GUI 的 WPF 应用程序 该 GUI 包含一个 组合框 其中包含实现特定接口的所有类名 具有显示的类名的类位于同一解决方案中 组合框旁边有一个按钮 用于刷新组合框中的