为什么我无法使用 Type.GetType() 来查找 app.config 中引用的插件实例的类型?

2023-12-09

所以这就是交易。我有我的解决方案,其中有几个项目:

  • 包装器项目 - 这只是一个控制台应用程序,当前在调试期间代表 Windows 服务。
  • 一个工作者项目——包含代码的核心内容。这样我就可以轻松地调试 Windows 服务的代码,而不用头疼。
  • 插件库项目 - 这包含一个插件工厂来新建插件的具体实例。
  • 一个插件项目 - 这包含我的插件的具体实现。

我的包装应用程序包含我的 app.config,我的插件应直接引用它以进行自我配置。这样,我的包装应用程序不需要知道任何其他信息,只需调用适配器工厂来更新插件的实例即可。

<configuration>
  <appSettings>
    <add key="Plugin" value="Prototypes.BensPlugin" />
    <add key="Prototypes.BensPlugin.ServiceAddress" value="http://localhost/WebServices/Plugin.asmx" />
    <add key="Prototypes.BensPlugin.Username" value="TestUserName" />
    <add key="Prototypes.BensPlugin.Password" value="TestPassword" />
  </appSettings>
</configuration>

包装项目:

using Worker;

public class Program
{
    public static void Main()
    {
        var serviceProc = new ServiceProcess();
        serviceProc.DoYourStuff();
    }
}

工人项目:

using PluginLibrary;

namespace Worker
{
    public class ServiceProcess
    {
        public string GetRequiredAppSetting(string settingName)
        {
            /* Code to get a required configuration setting */
        }

        public void DoYourStuff()
        {
            string pluginTypeName = GetRequiredAppSetting("Plugin"); 
            //At this point, pluginTypeName = "Prototypes.BensPlugin"
            Type type = Type.GetType(pluginTypeName); //type == null, wth!?

            //string testTypeName = new BensPlugin().GetType().ToString();
            ///At this point, testTypeName = "Prototypes.BensPlugin"
            //Type testType = Type.GetType(testTypeName)
            ///And testType still equals null!

            if (type != null)
            {
                IPlugin plugin = PluginFactory.CreatePlugin(type);
                if (plugin != null)
                plugin.DoWork();
            }
        }
    }
}

插件库:

namespace PluginLibrary
{
    public interface IPlugin
    {
        void DoWork();
    }

    public class PluginFactory
    {
        public IPlugin CreatePlugin(Type pluginType)
        {
            return (IPlugin)Activator.CreateInstance(pluginType);
        }
    }
}

Plugin:

using PluginLibrary;

namespace Prototypes
{
    public class BensPlugin : IPlugin
    {
        public string ServiceAddress { get; protected set; }
        public string username { get; protected set; }
        public string password { get; protected set; }

        public void DoWork()
        {
            Trace.WriteLine("Ben's plugin is working.");
        }

        public BensPlugin()
        {
            /* Code to self configure from app.config */
        }
    }
}

好的,这就奠定了基础。当我引用时,我遇到困难的地方是在我的工人项目中Type.GetType(pluginTypeName). My pluginTypeName正在从配置中正确提取,但是Type.GetType(pluginTypeName)回报null。我尝试直接在代码中的同一位置更新插件的实例:

var obj = new BensPlugin();

这工作得很好,而且obj.GetType().ToString()返回与我在中配置的完全相同的字符串app.config.

谁能告诉我为什么我可以在代码中的那个位置新建一个具体对象,但是Type.GetType(pluginTypeName)会失败吗?


您可能需要指定该类型位于哪个程序集中:

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

为什么我无法使用 Type.GetType() 来查找 app.config 中引用的插件实例的类型? 的相关文章

随机推荐

  • 使用请求库的重试历史记录

    我正在我的 Orchestrate 脚本中构建一个新的重试功能 我想知道尝试连接到特定 URL 时我的请求方法发生了多少次 以及 如果可能 发生了什么错误 现在 我需要这个用于记录目的 因为我正在开发一个消息系统 一旦我在一个消息系统中工作
  • 如何访问从故事板加载的视图控制器的属性?

    我有一个创建的视图控制器实例instantiateViewControllerWithIdentifier像这样 TBSCTestController testController self storyboard instantiateVi
  • 使用 opencv 进行音频输出和视频处理

    我正在使用 opencv 处理视频 但同时我需要播放音频并简单地控制它 例如大声或当前帧号 我想我应该用 ffmpeg 创建一个并行进程 但我不知道该怎么做 你能解释一下该怎么做吗 或者你知道另一种解决方案吗 I think ffmpeg应
  • 在共享存储 Xamarin 表单中保存文件

    我需要在android的共享存储中保存一个文件 我发现了这个链接 gt https developer android com training data storage shared documents files 我正在使用依赖项服务
  • 如何在 node.js selenium-webdriver 中模拟右键单击?

    我在用用于 Node js 的 selenium webdriver 如何使用该驱动程序模拟右键单击 我在官方文档中找不到这个 谢谢 wmash 你帮我找到解决方案 答案 已找到here driver actions click eleme
  • 如何在不使用构造函数 DI 的情况下创建 Http 实例? (RC.5+) [重复]

    这个问题在这里已经有答案了 我需要在不使用 Angular2 的 DI 的情况下获取 Http 的实例 constructor private http Http 以下代码摘自另一个 stackoverflow 问题 并且它适用于 Angu
  • 如何允许用户在 Android 应用程序中添加和删除选项卡

    我正在开发一个使用选项卡的应用程序 每个选项卡都链接到一个网页 用户可以使用 webview 查看该网页并与之交互 我遇到的问题是实现一个添加和删除命令 用户可以根据需要使用该命令删除选项卡 或者添加一个带有自己选择的 url 的选项卡 其
  • 为什么 std::make_unique 调用复制构造函数

    我想知道为什么 make unique 调用复制构造函数但不调用默认构造函数 Node std cout lt lt default Node std cout lt lt Delete Node const Node other std
  • jQuery Mobile / Handlebars - 打开面板隐藏 data-role=content div

    我正在尝试将 Handlebars 与 jQuery mobile 一起使用 我正在使用 jQuery 1 9 1 jQueryMobile 1 4 Handlebars 1 1 2 div div div h1 Title h1 div
  • Rails db:migrate 与 rake db:migrate

    我注意到在 Rails 5 中生成数据迁移时 有些人使用rails db migrate over rake db migrate 有人可以解释一下两者之间的区别吗rails和rake数据库迁移命令 这是否意味着rake命令在 Rails
  • 替换 int 中的字节

    一个int由4个字节组成 我如何用新字节替换这 4 个字节之一 换句话说 我正在寻找一种方法 int ReplaceByte int index int value byte replaceByte implementation 例如 如果
  • 使用 Docker Compose 和 WordPress 映像设置 Xdebug

    我正在尝试使用 docker compose 设置 Xdebug 我正在使用 PhpStorm IDE 并且我正在使用的 Docker 映像安装 PHP 7 2 我正在尝试在这个 WordPress 图像的上下文中执行此操作 这是我当前的
  • 使用相同的 Visual Studio 解决方案部署多个 WP7 应用程序?

    如何使用同一 Visual Studio 解决方案部署多个 WP7 应用程序 我需要改变什么才能实现这一目标 更改 Xap 文件名 程序集 GUID 和标题无法实现此目的 事实上 VS 用新标题覆盖旧的 但不部署单独的应用程序 背景 我们有
  • Javascript 将选定的复选框限制为 2 个

    我想禁用选择超过 2 个选择复选框 但我无法使用我的 javascript 代码做到这一点 我怎样才能做到这一点 btn addEventListener click function var ourRequest new XMLHttpR
  • Android O 中的 Doze 模式下前台服务未接收位置更新

    我有一个前台服务需要获取单个位置更新 它由特定的广播启动 启动后它只需在我们的后端发出一个请求 当它收到另一个广播时 它会请求位置更新 一次 执行另一个后端请求 然后自行停止 编辑 澄清一下 服务本身执行位置更新和后端请求 在这方面它独立于
  • Javascript - 每个订单的单个数组中所有可能的组合

    Javascript 生成单个数组中元素的所有组合 成对 所以我已经看到了这个问题 也看到了它的一些答案 但我想知道是否有可能获得所有组合 即使它在每个可能的顺序中都是重复的 ex var array apple banana lemon
  • 使用 ggplot aes_string、group 和 linetype 时出现的问题

    假设我有这个数据集 x lt rnorm 1000 y lt rnorm 1000 2 5 line color lt sample rep 1 4 250 line type lt as factor sample rep 1 5 200
  • Android:如何使用计时器

    这是我的第一篇文章 所以我正在学习 Android 和 Java 来自 Actionscript 并且我正在开发一个项目 我试图单击一个 ImageView 让该 ImageView 交换图像一秒钟 然后返回到原始图像 这是一个点击游戏 听
  • HashMap 中的重复值

    我遇到了大麻烦 创建了一个 hashMap 并使用相同的键插入了两个值 StringBuilder作为map的键 现在 虽然尝试使用 StringBuilder 对象检索数据工作正常 但在其他情况下它无法返回任何值 我在下面给出的代码中列出
  • 为什么我无法使用 Type.GetType() 来查找 app.config 中引用的插件实例的类型?

    所以这就是交易 我有我的解决方案 其中有几个项目 包装器项目 这只是一个控制台应用程序 当前在调试期间代表 Windows 服务 一个工作者项目 包含代码的核心内容 这样我就可以轻松地调试 Windows 服务的代码 而不用头疼 插件库项目