.Net平台下实例类型无法转换成接口类型?
2020-12-12 23:26
标签:style blog class code tar color 首先这种情况出现在应用程序启动前的方法里面。 本想通过发射来实现一些功能。谁知道被这个坑了。 碰到这种问题。已经相当无语了。同时也不知道该如何解决。望有能之士帮忙解答 上面是代码。 如果通过Type.IsAssignableFrom方法来查找接口的实现,根本查不到。 这是目录结构 这是Module的实现 .Net平台下实例类型无法转换成接口类型?,搜素材,soscw.com .Net平台下实例类型无法转换成接口类型? 标签:style blog class code tar color 原文地址:http://www.cnblogs.com/showstyle/p/3706188.html
using
System;
using
System.IO;
using
System.Linq;
using
System.Reflection;
using
System.Web;
using
System.Web.Compilation;
using
System.Web.Hosting;
using
Infrastructure;
[assembly: PreApplicationStartMethod(
typeof
(PreApplicationInit),
"InitializePlugins"
)]
namespace
Infrastructure
{
public
class
PreApplicationInit
{
static
PreApplicationInit()
{
var
pluginsPath = HostingEnvironment.MapPath(
"~/plugins"
);
var
pluginsTempPath = HostingEnvironment.MapPath(
"~/plugins/temp"
);
if
(pluginsPath ==
null
|| pluginsTempPath ==
null
)
throw
new
DirectoryNotFoundException(
"plugins"
);
PluginFolder =
new
DirectoryInfo(pluginsPath);
TempPluginFolder =
new
DirectoryInfo(pluginsTempPath);
}
///
/// The source plugin folder from which to copy from
///
///
/// This folder can contain sub folders to organize plugin types
///
private
static
readonly
DirectoryInfo PluginFolder;
///
/// The folder to copy the plugin DLLs to use for running the app
///
private
static
readonly
DirectoryInfo TempPluginFolder;
///
/// Initialize method that registers all plugins
///
public
static
void
InitializePlugins()
{
var
assemblies = PluginFolder.GetFiles(
"*.dll"
, SearchOption.AllDirectories)
.Select(x => Assembly.LoadFrom(x.FullName));
foreach
(
var
assembly
in
assemblies)
{
var
type = assembly.GetTypes().FirstOrDefault(t => t.GetInterface(
typeof
(IModule).Name) !=
null
);
if
(type ==
null
)
continue
;
//Add the plugin as a reference to the application
if
(AppDomain.CurrentDomain.GetAssemblies().All(a => a.FullName != assembly.FullName))
{
BuildManager.AddReferencedAssembly(assembly);
}
//Add the modules to the PluginManager to manage them later
var
module = (IModule)Activator.CreateInstance(type);
PluginManager.Current.Modules.Add(module, assembly);
}
}
}
}
using
System;
using
Infrastructure;
namespace
NewsPlugin
{
public
class
Module:IModule
{
public
string
Name {
get
{
return
"NewsPlugin"
;
}
set
{
if
(value ==
null
)
throw
new
ArgumentNullException(
"value"
);
this
.Name = value;
}
}
}
}