欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【用.net动态创建类的实例】,下面是详细的分享!
用.net动态创建类的实例
用.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
以上所分享的是关于用.net动态创建类的实例,下面是编辑为你推荐的有价值的用户互动:
相关问题:创建类的实例 有什么作用?
答:实例化是把抽象的java类实例出个体。例如 public class 类1{ 方法1(){} 方法2(){} } 实例出个体:类1 个体名=new 类1(); 个体名称作为:对象。 整个实例化过程称作:实例化对象。 用对象直接调用方法1。或者方法2 个提名.方法1(); .............. >>详细
相关问题:C# 如何动态创建一个类
答:C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的。 主要功能代码如下: public static Assembly NewAssembly() { //创建编译器实例。 provider = new CSharpCodeProvider(); //设置编译... >>详细
相关问题:asp.net c# 类的实例化
答:public static SqlConnection CreateConn() 关键词 static 说明 CreateConn() 这个方法是静态方法不需要实例化 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
