Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用反射加载的类型的方法_C#_Plugins_Reflection_Asp.net Web Api - Fatal编程技术网

C# 未调用反射加载的类型的方法

C# 未调用反射加载的类型的方法,c#,plugins,reflection,asp.net-web-api,C#,Plugins,Reflection,Asp.net Web Api,我在为ASP.NETWebAPI项目开发的“插件”系统中看到了一些奇怪的行为。插件是DLL,它们被复制到bin文件夹中。这意味着它们已在当前AppDomain中 每个插件都有一个实现IPluginConfiguration的配置类 下面的类通过查找当前AppDomain中实现IPluginConfiguration接口的所有类来配置插件。这是从Global.asax.cs调用的 public class PluginConfigurator { /* ... */ public

我在为ASP.NETWebAPI项目开发的“插件”系统中看到了一些奇怪的行为。插件是DLL,它们被复制到bin文件夹中。这意味着它们已在当前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));
    }
}
所以我希望我的日志文件会说

Configuring test plugin
Configured Type: MyNameSpace.PluginConfiguration

但事实上我只是

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

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

有什么建议可以导致这种情况或如何修复它吗?

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

我要做的第一件事是在
Configure()
中显式地抛出异常,以确保方法真正被调用。在这种情况下,您应该看到“类型错误:”字符串。(可能会在异常中抛出一个自定义字符串以确保绝对正确。)

一旦你确定它被调用,你就可以开始处理日志问题了。我最好的猜测是,在尝试过绝望日志策略并失败之后,应该是权限。由于这可能是一个web应用程序,因此写入权限将受到相当大的限制。您也可能会遇到日志文件,但根本找不到日志文件

在任何情况下,由于反射,您可能不会遇到一个神秘的“被称为但未被称为”的情况。这很可能是一个更普通的问题

我要做的第二件事是忘记尝试制作一个自定义插件系统,而是使用,呵呵

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