看了网上很多关于dotnet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用“activator.createinstance”。但是这个方法需要待创建的类的type作为参数,为了获得该参数,可以利用[assembly].gettype方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集。如何获得待创建的类所在程序集,那么就解决了这个问题。
大家可以参考http://www.cnblogs.com/shadowk/archive/2006/11/14/560131.html,费了很多笔墨写了一个比较完整的动态构造类的设计器。其实,在获得程序集这个问题上,可以有更简单的办法,以下是我的做法。
利用microsoft.visualbasic.vbcodeprovider(),如果是c#可以用csharpcodeprovider(),将类文件编译成为dll文件,然后利用[assembly].loadfrom("dll 的绝对路径")加载该dll。这样我们可以避免在那些创建dll和type的复杂代码。我告诉我的项目组成员这个例子后,强调要打开思路,simple is perfect,凡事都尽量找简便的方法来实现,客户永远不会为我们那些复杂的代码多花一分钱。
1.执行编译任务的方法:
以下为引用的内容: public shared function compileexecutable()function compileexecutable(byval sourcename as string, byval dllpath as string, byref returndllname as string) as boolean dim sourcefile as fileinfo = new fileinfo(sourcename) dim provider as codedomprovider = nothing dim compileok as boolean = false ' 根据原文件的扩展名选择code provider if sourcefile.extension.toupper(cultureinfo.invariantculture) = ".cs" then provider = new microsoft.csharp.csharpcodeprovider() elseif sourcefile.extension.toupper(cultureinfo.invariantculture) = ".vb" then provider = new microsoft.visualbasic.vbcodeprovider() else console.writeline("原文件必须包含 .cs 或 .vb 扩展名") end if if not provider is nothing then ' 构造dll文件的全路径 dim dllname as string = string.format("{0}/{1}.dll", _ dllpath, _ sourcefile.name.replace(".", "_")) returndllname = dllname dim cp as compilerparameters = new compilerparameters() ' 设置编译控制参数 cp.generateexecutable = false '生成dll,如果是true则生成exe文件 cp.outputassembly = dllname cp.generateinmemory = false cp.treatwarningsaserrors = false ' 调用编译方法将原代码文件编译成dll dim cr as compilerresults = provider.compileassemblyfromfile(cp, _ sourcename) if cr.errors.count > 0 then ' 显示编译错误 console.writeline("编译错误 {0} 编译成 {1}", _ sourcename, cr.pathtoassembly) dim ce as compilererror for each ce in cr.errors console.writeline(" {0}", ce.tostring()) console.writeline() next ce else ' 显示编译成功的消息 console.writeline("原文件 {0} 编译成 {1} 成功完成.", _ sourcename, cr.pathtoassembly) end if ' 返回编译结果 if cr.errors.count > 0 then compileok = false else compileok = true end if end if return compileok end function |
2.编译dll,并动态创建类的实例。(这里类的原文件是class1.vb文件,放在website的app_code文件夹中了,实际使用时可以放在任意物理位置。)
以下为引用的内容: dim strsourcefilename as string = server.mappath("~/app_code/class1.vb") '类文件的全路径 dim strdllpath as string = server.mappath("~/app_code") '编译后的dll文件存放的位置 dim strdllname as string = "" 'dll的全路径(返回值) compileexecutable(strsourcefilename, strdllpath, strdllname) '编译原文件为dll文件 dim a as [assembly] = [assembly].loadfrom(strdllname) '加载dll dim mytype as system.type = a.gettype("class1") '获得class1的type dim obj as object = activator.createinstance(mytype) '获得class1的实例 |
3.class1.vb原文件
以下为引用的内容: public class class1class class1 public i as integer end class |
新闻热点
疑难解答
图片精选