首页 > 编程 > .NET > 正文

应用技巧:用.net动态创建类的实例

2024-07-10 13:08:25
字体:
来源:转载
供稿:网友

  看了网上很多关于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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表