Solved

Can't delete a compiled file -  "file in use"

Posted on 2008-10-23
2
288 Views
Last Modified: 2012-05-05
I'm running the code below that compiles and runs a dll. It works great - except when the program loops back around it can't delete the existing dll because "file is in use"
Once the dll below is created and run, how can i released it so i can then delete it?
Try
            If m_Code.Trim <> "" Then
                If m_Namespace.Trim <> "" Then
                    If m_ClassName.Trim <> "" Then
 
                        Try
                            If File.Exists(m_AppPath & "\" & m_Namespace & ".dll") Then File.Delete(m_AppPath & "\" & m_Namespace & ".dll")
                            If File.Exists("c:\windows\system32\" & m_Namespace & ".dll") Then File.Delete("c:\windows\system32\" & m_Namespace & ".dll")
                        Catch
                        End Try
 
                        Dim VBP As New VBCodeProvider()
                        Dim CVB As System.CodeDom.Compiler.ICodeCompiler
                        CVB = VBP.CreateCompiler
                        Dim PM As New System.CodeDom.Compiler.CompilerParameters()
                        PM.GenerateInMemory = False
                        PM.OutputAssembly = m_Namespace & ".dll"
                        PM.MainClass = m_ClassName
                        PM.IncludeDebugInformation = True
 
                        'Add assemblies
                        Dim ASM As System.Reflection.Assembly
                        For Each ASM In AppDomain.CurrentDomain.GetAssemblies()
                            PM.ReferencedAssemblies.Add(ASM.Location)
                        Next
                        PM.ReferencedAssemblies.Add(m_AppPath & "\ActiveReports.dll")
                        PM.ReferencedAssemblies.Add(m_AppPath & "\ActiveReports.XlsExport.dll")
                        PM.ReferencedAssemblies.Add(m_AppPath & "\ActiveReports.PdfExport.dll")
                        PM.ReferencedAssemblies.Add(m_AppPath & "\ActiveReports.Viewer.dll")
                        PM.ReferencedAssemblies.Add(m_AppPath & "\interp.business.dll")
 
                        'here we do the deed
                        Dim Results As System.CodeDom.Compiler.CompilerResults
                        Results = CVB.CompileAssemblyFromSource(PM, m_Code)
 
                        'this is just to list out all the errors if any
                        Dim Err As System.CodeDom.Compiler.CompilerError
                        For Each err In Results.Errors
                            m_Results &= "Number " & err.ErrorNumber & " Text " & err.ErrorText & " Line " & err.Line & VbCrLf
                        Next
 
                        Dim RunObj As New Object()
                        Dim vArgs() As Object
                        RunObj = Results.CompiledAssembly.CreateInstance(m_Namespace & "." & m_ClassName, False, Reflection.BindingFlags.CreateInstance, Nothing, vArgs, Nothing, Nothing)
                        If RunObj Is Nothing Then
                            m_Results &= "Unable to run dll - failed." & VbCrLf
                        End If
 
                    Else
                        m_Results &= "No class name found." & VbCrLf
                    End If
                Else
                    m_Results &= "No namespace found." & VbCrLf
                End If
            Else
                m_Results &= "No code found." & VbCrLf
            End If
 
            If Len(m_Results) = 0 Then m_Results = "OK"
        Catch err As Exception
            m_Results &= "ERROR: " & err.Message & " " & err.StackTrace & VbCrLf
        End Try

Open in new window

0
Comment
Question by:LosBear
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
2 Comments
 
LVL 11

Accepted Solution

by:
melmers earned 250 total points
ID: 22892996
You can only unload an assembly if it is in another appdomain.
So you must create an appdomain which loads the compiled assembly and when it should unload you must unload the whole appdomain.

Here is an MSDN Magazine Article about it.
http://msdn.microsoft.com/en-us/magazine/cc163476.aspx
0
 
LVL 1

Author Closing Comment

by:LosBear
ID: 31509268
Thanks
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction When many people think of the WebBrowser (http://msdn.microsoft.com/en-us/library/2te2y1x6%28v=VS.85%29.aspx) control, they immediately think of a control which allows the viewing and navigation of web pages. While this is true, it's a…
Creating an analog clock UserControl seems fairly straight forward.  It is, after all, essentially just a circle with several lines in it!  Two common approaches for rendering an analog clock typically involve either manually calculating points with…
Michael from AdRem Software outlines event notifications and Automatic Corrective Actions in network monitoring. Automatic Corrective Actions are scripts, which can automatically run upon discovery of a certain undesirable condition in your network.…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…

632 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question