【问题标题】:Method of type loaded by reflection is not being called反射加载的类型方法未被调用
【发布时间】:2014-02-21 14:49:22
【问题描述】:

我正在为 ASP.NET Web API 项目开发的“插件”系统出现一些奇怪的行为。插件是复制到 bin 文件夹中的 DLL。这意味着它们已经在当前的 AppDomain 中。

每个插件都有一个实现 IPluginConfiguration 的配置类。

以下类通过查找当前 AppDomain 中实现 IPluginConfiguration 接口的所有类来配置插件。这是从 Global.asax.cs 调用的

public class PluginConfigurator
{
    /* ... */

    public static void Register(HttpConfiguration config)
    {
        var pluginConfigs = GetPluginConfigurations();

        try
        {
            foreach (var pluginConfigType in pluginConfigs)
            {
                var pluginConfig = (IPluginConfiguration) Activator.CreateInstance(pluginConfigType);
                pluginConfig.Configure(config);
                Logger.Log("Configured Type: {0}", pluginConfigType.FullName);
            }
        }
        catch (ReflectionTypeLoadException e)
        {
            Logger.Log("Error of type: {0}", e.GetType().Name);
        }
    }

    private static IEnumerable<Type> GetPluginConfigurations()
    {
        return  AppDomain.CurrentDomain
                                .GetAssemblies()
                                .SelectMany(t => t.GetTypes())
                                .Where(type => !type.IsInterface)
                                .Where(type => typeof(IPluginConfiguration).IsAssignableFrom(type));
    }
}

我的测试插件有以下配置。

public class PluginConfiguration : IPluginConfiguration
{
    /* ... */

    public void Configure(HttpConfiguration config)
    {
        try
        {
            Logger.Log("Configuring test plugin");
            RegisterRoutes(config);
        }
        catch (Exception e)
        {
            Logger.Log("Error of type {0} in configuration", e.GetType().Name);
        }
    }

    /* ... */
}

所以我希望我的日志文件会这样说

Configuring test plugin
Configured Type: MyNameSpace.PluginConfiguration

Configuring test plugin
Error of type MyNameSpace.PluginConfiguration in configuration
Configured Type: MyNameSpace.PluginConfiguration

但实际上我只是得到

Configured Type: MyNameSpace.PluginConfiguration

在此之前还有其他日志记录。我认为这可能是日志记录的问题,所以我让它在 PluginConfiguration 类中创建了一个文件,但它也没有这样做。看来我的 PluginConfiguration 类没有被调用。

我创建了一个调用 PluginConfigurator 类的单元测试,并且确实调用了该方法。

关于什么可能导致此问题或如何解决此问题的任何建议?

【问题讨论】:

    标签: c# plugins reflection asp.net-web-api


    【解决方案1】:

    当我将代码粘贴到我正在开发的 Web 应用程序的 Application_Start() 并从 bin 加载辅助 DLL 时,该代码对我有效(即,我看到两条日志消息)文件夹。

    我要做的第一件事就是让自己放心,这个方法确实被调用了,就是在你的Configure() 中显式地抛出一个异常。在这种情况下,您应该看到“类型错误:”字符串。 (也许可以在您的异常中抛出一个自定义字符串以绝对确定。)

    一旦您确定它被调用,您就可以开始处理日志记录问题。我之前尝试过绝望的日志记录策略并失败了,我最好的猜测是权限。由于这可能是一个网络应用程序,因此写入权限将受到很大限制。您也可能遇到 ASP.NET's shadow copy 并且根本找不到日志文件。

    无论如何,由于反射,您可能不会遇到神秘的被调用但未被调用的情况。这很可能是一个更普通的问题。

    我要做的第二件事就是忘记尝试制作自定义插件系统并改用MEF,呵呵。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多