c#

位置:IT落伍者 >> c# >> 浏览文章

用.NET动态创建类的实例讲解


发布日期:2024年01月16日
 
用.NET动态创建类的实例讲解

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

               

上一篇:.net工程师必懂的20道题

下一篇:技巧:.Net框架类库中定时器类的使用[1]