看了网上很多关于DotNet动态创建类的实例的文章我这里想总结一下其实方法很简单就是用ActivatorCreateInstance但是这个方法需要待创建的类的Type作为参数为了获得该参数可以利用[Assembly]GetType方法这个方法只需要待创建的类的名称(名称字符串)就可以了最后的问题就是要获得这个类所在的程序集如何获得待创建的类所在程序集那么就解决了这个问题
大家可以参考http://wwwcnblogscom/ShadowK/archive////html费了很多笔墨写了一个比较完整的动态构造类的设计器其实在获得程序集这个问题上可以有更简单的办法以下是我的做法
利用MicrosoftVisualBasicVBCodeProvider()如果是C#可以用CSharpCodeProvider()将类文件编译成为DLL文件然后利用[Assembly]LoadFrom(DLL 的绝对路径)加载该DLL这样我们可以避免在那些创建DLL和Type的复杂代码我告诉我的项目组成员这个例子后强调要打开思路Simple is perfect凡事都尽量找简便的方法来实现客户永远不会为我们那些复杂的代码多花一分钱
执行编译任务的方法
以下是引用片段
PublicSharedFunctionCompileExecutable()FunctionCompileExecutable(ByValsourceNameAsStringByValDLLPathAsStringByRefReturnDLLNameAsString)AsBoolean
DimsourceFileAsFileInfo=NewFileInfo(sourceName)
DimproviderAsCodeDomProvider=Nothing
DimcompileOkAsBoolean=False
根据原文件的扩展名选择codeprovider
IfsourceFileExtensionToUpper(CultureInfoInvariantCulture)=CSThen
provider=NewMicrosoftCSharpCSharpCodeProvider()
ElseIfsourceFileExtensionToUpper(CultureInfoInvariantCulture)=VBThen
provider=NewMicrosoftVisualBasicVBCodeProvider()
Else
ConsoleWriteLine(原文件必须包含cs或vb扩展名)
EndIf
IfNotproviderIsNothingThen
构造DLL文件的全路径
DimdllNameAsString=StringFormat({}\{}dll_
DLLPath_
sourceFileNameReplace(_))
ReturnDLLName=dllName
DimcpAsCompilerParameters=NewCompilerParameters()
设置编译控制参数
cpGenerateExecutable=False生成DLL如果是True则生成exe文件
cpOutputAssembly=dllName
cpGenerateInMemory=False
cpTreatWarningsAsErrors=False
调用编译方法将原代码文件编译成DLL
DimcrAsCompilerResults=providerCompileAssemblyFromFile(cp_
sourceName)
IfcrErrorsCount>Then
显示编译错误
ConsoleWriteLine(编译错误{}编译成{}_
sourceNamecrPathToAssembly)
DimceAsCompilerError
ForEachceIncrErrors
ConsoleWriteLine({}ceToString())
ConsoleWriteLine()
Nextce
Else
显示编译成功的消息
ConsoleWriteLine(原文件{}编译成{}成功完成_
sourceNamecrPathToAssembly)
EndIf
返回编译结果
IfcrErrorsCount>Then
compileOk=False
Else
compileOk=True
EndIf
EndIf
ReturncompileOk
EndFunction
编译DLL并动态创建类的实例(这里类的原文件是Classvb文件放在WebSite的App_Code文件夹中了实际使用时可以放在任意物理位置)
以下是引用片段
DimstrSourceFileNameAsString=ServerMapPath(~/App_Code/Classvb)类文件的全路径
DimstrDllPathAsString=ServerMapPath(~/App_Code)编译后的DLL文件存放的位置
DimstrDllNameAsString=DLL的全路径(返回值)
CompileExecutable(strSourceFileNamestrDllPathstrDllName)编译原文件为DLL文件
DimaAs[Assembly]=[Assembly]LoadFrom(strDllName)加载DLL
DimmyTypeAsSystemType=aGetType(Class)获得Class的Type
DimobjAsObject=ActivatorCreateInstance(myType)获得Class的实例
Classvb原文件
以下是引用片段
PublicClassClassClassClass
PubliciAsInteger
EndClass