关于动态加载程序集的问题

来源:百度知道 编辑:UC知道 时间:2024/09/24 02:14:56
在做自己的一个网站的时候,遇到这样一个问题

为了能使自己的web应用程序支持不同的数据库

我自己定义了很多接口,用来处理网站的数据

现在我写了两个程序集 MyData.OleDb 和MyData.Sql

这两个命名空间中包含了网站数据操作要实现的所有类,且这些类均实现了前边定义的那些接口

我新建了个配置文件

dataProvider.config

内容如下:

Code Snippet<?xml version="1.0" encoding="utf-8"?>
<DataProviderFactory>
<DataProviders DefaultDataProvider="Access">
<DataProvider Name="Access" assembly="MyData.OleDb">
....
</DataProvider>
<DataProvider Name="SqlServer" assembly="MyData.Sql">

....

</DataProvider>
</DataProviders>

</DataProviderFactory>

我想通过此配置文件来调用类中的方法

比如说这里设置的默认数据提供为Access 且对应的程序集为MyData.OleDb

那么在我写开发其他页面的时候需要用到MyData.OleDb和MyData.Sql程序集中都有的类UserReg中的AddUser方法

但是具体用那个程序集中的方法是根据刚才那个配置文件来觉得
<

应该用到反射
引入System.Reflection命名空间

用Assembly.Load(程序集文件的绝对路径)方法加载程序集,再搜索实现了指定接口的类,用Activator.CreateInstance(Type t)方法创建其实例即可,下面是一个例子(源自我自己的一段代码):
/// <summary>加载指定DLL文件里的插件</summary>
/// <param name="path">DLL文件文件路径(绝对路径)</param>
public static ICodeProvider[] Load(string path)
{
List<ICodeProvider> Res = new List<ICodeProvider>();
try
{
Assembly asm = Assembly.LoadFile(path);
foreach (Module Modules in asm.GetModules(false))
{
foreach (System.Type Type in Modules.GetTypes())
{
foreach (System.Type Iface in Type.FindInterfaces(find,typeof(ICodeProvider).Name))
{
Res.Add((ICodeProvider)Activator.CreateInstance(Type));
}
}
}
}