gpt4 book ai didi

c# - 反射加载类型的方法未被调用

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:22 26 4
gpt4 key购买 nike

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

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

以下类通过查找当前 AppDomain 中实现 IPluginConfiguration 接口(interface)的所有类来配置插件。这是从 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 类的单元测试,该方法确实被调用了。

有什么可能导致此问题或如何解决的建议吗?

最佳答案

当我将代码粘贴到我正在处理的 Web 应用程序的 Application_Start() 并从 < strong>bin 文件夹。

我要做的第一件事就是在您的 Configure() 中明确抛出异常,以确保方法确实被调用。在这种情况下,您应该会看到“类型错误:”字符串。 (也许在您的异常中抛出一个自定义字符串以确保万无一失。)

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

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

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

关于c# - 反射加载类型的方法未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com