首页 > 编程 > .NET > 正文

用.net动态创建类的实例

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

用.net动态创建类的实例

看了网上很多关于dotnet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用“activator.createinstance”。但是这个方法需要待创建的类的type作为参数,为了获得该参数,可以利用[assembly].gettype方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集。如何获得待创建的类所在程序集,那么就解决了这个问题。

其实,在获得程序集这个问题上,可以有更简单的办法,以下是我的做法。

利用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


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