第一次在博客上面乱弹,实在有点惭愧。但有的时候真希望能将自己的所得拿出来和大家分享。为了不让自己的成果尘封,也不让自己的错误延续,我还是决定拿出来和给大家看看。如果我的所说没错的话希望能对大家有用;如果有问题的话还真希望大家斧正。
这篇文章是关于程序集的动态加载的问题,这也是我最近在关注的。在我们的项目中,就使用到了程序集的动态加载。也许有的人会问:使用VS2005,我们可以很方便的通过引用---》添加引用来将程序集引如我们的工程,还用动态加载吗?其实不然,上面的方式有个前提就是我们必须事先知道要添加的引用,而在有的时候我们不能事先确切的知道要加载的程序集体。在目前很多分层的C/S结构的系统中,使用程序集的动态加载来实现各层之间的调用是很普遍的。比如,从画面层到逻辑处理层,一个画面层对应一个逻辑处理层。一种普遍的做法就是用一个配置文件来记录画面层和逻辑处理层的对应关系,当一个画面要调用它的逻辑处理层时首先来读这个配置文件,得到相应的逻辑处理层的信息(一般说来,这个信息需要包括两个方面的信息:程序集的路径和要实例化的类的全名)。然后用动态加载的方式将程序集引用进来,并得到一个需要的实例。然后就可以使用了。
说的有点远了啊,言归正专,这里我关注的只有一点:如何通过动态的方式将程序集体加载近来的?看下面的代码(作为一个函数,已通过简单的测试):
private Form LoadFromAsmbl(string strAsmblPath, string strClassName)

...{
// 验证你的程序集是不是存在,你的总不能去引用一个不存在的东西吧?
if(!File.Exists(strAsmblPath))

...{
MessageBox.Show("Assembly Not Exists!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}

// 这里就加载程序集了,有很多种方式。去MSDN上看看吧
Assembly asmbl = null;
try

...{
asmbl = Assembly.LoadFrom(strAsmblPath);
if (asmbl == null)

...{
throw new Exception("Fail to load assembly " + strAsmblPath);
}
}
catch(Exception e)

...{
MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}

// 实例化你要的对象,如果成功的话就没问题了*_*
Form frmController = null;
try

...{
frmController = (Form)asmbl.CreateInstance(strClassName);
if (frmController == null)

...{
throw new Exception("Fail to create instance of " + strClassName);
}
}
catch(Exception e)

...{
MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}

// 到这里你就可以放心了*_*
return frmController;
}
private Form LoadFromAsmbl(string strAsmblPath, string strClassName)
...{
// 验证你的程序集是不是存在,你的总不能去引用一个不存在的东西吧?
if(!File.Exists(strAsmblPath))
...{
MessageBox.Show("Assembly Not Exists!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
// 这里就加载程序集了,有很多种方式。去MSDN上看看吧
Assembly asmbl = null;
try
...{
asmbl = Assembly.LoadFrom(strAsmblPath);
if (asmbl == null)
...{
throw new Exception("Fail to load assembly " + strAsmblPath);
}
}
catch(Exception e)
...{
MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
// 实例化你要的对象,如果成功的话就没问题了*_*
Form frmController = null;
try
...{
frmController = (Form)asmbl.CreateInstance(strClassName);
if (frmController == null)
...{
throw new Exception("Fail to create instance of " + strClassName);
}
}
catch(Exception e)
...{
MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
// 到这里你就可以放心了*_*
return frmController;
} 上面用到了一个重要的东东:Assembly,在System.Reflection名称空间下,如果想做更多的了解就去MSDN上看看吧。由于代码很简单了,所以就不唠叨了。有一点,曾经在论坛上看见一个兄弟在问怎么释放引近来的程序集,这个问题我没有细究过,给个不负责任但或许有点道理的解释:.NET的自动回收机制*_*。哪位有想法的不要忘了告诉俺一声啊。

770

被折叠的 条评论
为什么被折叠?



