日期:2014-05-18  浏览次数:21104 次

★请教下关于动态编译CS文件和动态加载类库的问题。★欢迎大家各抒己见。
以前没研究过这种问题。现在想学习一下。 以前见过一个样板工程很经典,但是当时没备份,现在找不到了。
我简单介绍下。
那是一个服务系统,其实是一个服务平台,内部包括了很多的服务功能。
该系统启动时会加载N多插件类。(包括规则脚本,功能脚本,动作脚本,配置信息等等)这些脚本文件其实都是 C#的CS代码文件。 这个系统提供一套公开的API或者类和方法。然后允许你按照它的要求娶继承,去重载,去扩充一些类或者接口,直接写在CS文件里,方到制定的目录里。
系统启动的时候会先编译这些CS文件,并加载到程序内部。然后开始服务。
再系统执行期间,你仍然可以继续编写和修改CS文件,其中相当大的一部分CS文件并不需要重新启动系统生效。只要再系统的控制台输入指令,RELOAD XXXXX 这样的指令, XXXXX类型的CS文件就会被重新编译和加载。直接实现功能的调整。

现在很想学习这方面的技术。

补充: 对此技术本人很陌生,希望懂行的大侠们别只是说娶看MSDN,或者说去看什么什么说明。还是希望您能指点下方向和方法和流程,最好能有些理论上的介绍和讲解。。谢谢啦。

------解决方案--------------------
恩,我没见到过你说这个东西。但听起来相当不错。
你说的功能在CodeDOM中都可以实现,不过如果有已经实现好的模板,那当然是最好的。
------解决方案--------------------
没听过!帮顶一下!
------解决方案--------------------

very good
------解决方案--------------------
听不懂,但也要听,因为高手就是这样出来的,帮顶
------解决方案--------------------
关注~
------解决方案--------------------
给个例子

string sourceFileName=@"c:\test.cs";
FileInfo sourceFile = new FileInfo(sourceFileName);
CodeDomProvider provider = null;
bool compileOk = false;

provider = new Microsoft.CSharp.CSharpCodeProvider();


if (provider != null)
{
String asmName= String.Format(@"{0}\{1}.dll", 
System.Environment.CurrentDirectory, 
sourceFile.Name.Replace(".", "_"));

CompilerParameters cp = new CompilerParameters();

// 生成类库
cp.GenerateExecutable = false;

// 指定输出文件名
cp.OutputAssembly = asmName;

// 保存为文件
cp.GenerateInMemory = false;

// 不将编译警告作为错误
cp.TreatWarningsAsErrors = false;
 
// 编译
CompilerResults cr = provider.CompileAssemblyFromFile(cp, 
sourceName);

if(cr.Errors.Count <1)
{
// 加载
Assembly asm = Assembly.Load(asmName);
//调用
//DoSomething();
}

}

引用系统之外的dll只需要将其放到bin下面或者应用程序目录下就好了
------解决方案--------------------
mark,学习
------解决方案--------------------
关注一下!!
------解决方案--------------------
不理解,也没听过,既然来了,就帮顶下吧
------解决方案--------------------
这个有意思
。net好玩的东西都在这里了
------解决方案--------------------
人气好像不是很旺啊,我再来顶顶
------解决方案--------------------
http://www.cnblogs.com/lichdr/category/12610.html
慢慢看吧很详细
------解决方案--------------------
动态加载类库一般用反射!!
------解决方案--------------------
关注
------解决方案--------------------
之前差点就被要求写出这样一个动态编译的东西出来……关注一下……
------解决方案--------------------
其实就是这个嘛
http://topic.csdn.net/u/20080913/04/801f558c-1068-4751-88ca-e883298cf1b5.html
------解决方案--------------------
关注帮顶