C# 未调用反射加载的类型的方法
我在为ASP.NETWebAPI项目开发的“插件”系统中看到了一些奇怪的行为。插件是DLL,它们被复制到bin文件夹中。这意味着它们已在当前AppDomain中 每个插件都有一个实现IPluginConfiguration的配置类 下面的类通过查找当前AppDomain中实现IPluginConfiguration接口的所有类来配置插件。这是从Global.asax.cs调用的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
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