.net动态加载程序集占用文件

.net动态加载程序集占用文件,第1张

.NET动态加载程序集是一种在运行时动态加载程序集的方法,可以通过代码生成和加载程序集来实现灵活性更强的应用程序。但是使用.NET动态加载程序集可能占用文件,具体原因如下:

1. 程序集加载需要在磁盘上游绝返存储程序集文件,这是不可避免的。当你首次加载程序集时,它会从磁盘上读取该文件并将其加载到内存中。因此,这可能会导致一些磁盘IO *** 作。

2. 当程序集被加载时,它会占用系统内存。如果同宏亩时加载多个程序集,尤其是大型程序集,系统内存的使用量可能会增加很多。

3. 如果你使用了反射技术,在运行时动态创建和修改对象,可能会额外占用一些内存空间。

因此,如果你需要使用.NET动态加载程序集,需要注意以下几点:

1. 避免同时加载大型程序集,以减少系统内存的使用量。

2. 当程序集不再需要时,及时卸神饥载该程序集,释放系统内存。

3. 使用反射技术时,仅在必要时才创建和修改对象,尽量避免占用额外的内存空间。

4. 需要注意程序集文件的安全性,确保只加载可信任的程序集文件,避免受到恶意程序的攻击。

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

大家可以参考// cnblogs /ShadowK/archive/ / / / 费了很多笔墨写了一个比较完整的衫吵动态构造类的设计器 其实 在获得程序集这个问题上 可以有更简单的办法 以下是我的做法

利用Microsoft VisualBasic VBCodeProvider() 如果是C#可以用CSharpCodeProvider() 将类文件编译成为DLL文件 然后利用[Assembly] LoadFrom( DLL 的绝对路径 )加载该DLL 这样我们可以避免在那些创建DLL和Type的复杂代码 我告诉我的项目组成员这个例子后 强调要打开思路 Simple is perfect 凡事都尽量找简便升塌轮的方法来实现 客户永远不会为我们那些复杂的代码多花一分钱

执行编译任务的方法

以下是引用片段 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 pileOk 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( { }\{ } 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 >   Then  显示编译错误 Console WriteLine( 编译错误 { } 编译成 { }  _ sourceName  cr PathToAssembly) Dim ce As CompilerError For Each ce In cr Errors Console WriteLine(  { }  ce ToString()) Console WriteLine() Next ce Else  显示编译成功的消息 Console WriteLine( 原文件 { } 编译成 { } 成功完成  _ sourceName  cr PathToAssembly) End If  返回编译结果 If cr Errors Count >   Then pileOk = False Else pileOk = True End If End If Return pileOk End Function

编译DLL 并动态创建类的实例 (这里类的原文件是Class vb文件 放在WebSite的App_Code文件夹中了 实际使用时可以放在任意物理位置 )

以下是引用片段 Dim strSourceFileName As String = Server MapPath( ~/App_Code/Class 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( Class )  获得Class 的Type Dim obj As Object = Activator CreateInstance(myType)  获得Class 的实例

Class vb原文件

lishixinzhi/Article/program/net/201311/15309


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8199469.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存