推荐:关于C#静态构造函数的几点说明静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。
看了网上很多关于DotNet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用“Activator.CreateInstance”。但是这个方法需要待创建的类的Type作为参数,为了获得该参数,可以利用[Assembly].GetType方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集。如何获得待创建的类所在程序集,那么就解决了这个问题。
大家可以参考http://www.VeVb.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 |
分享:MSDN Visual系列:创建SharePoint Services解决方案包WSSv3引入了一种名为“解决方案包”的部署机制。这套机制可以支持将解决方案作为一个整体单元来部署。这样,我们就可以方便的维护,测试和多次的重复使用。我们可以将制作好的SharePo
新闻热点
疑难解答
图片精选