2010-09-30 55 views
1

我想向用戶顯示舊的和新的版本號,然後複製新版本。當我試圖在顯示版本信息後複製文件時,我得到以下例外處置程序集

進程無法訪問文件'C:\ Auto TEC \ Common.dll',因爲它正在被另一個進程使用。

下面是代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Reflection; 
using System.Diagnostics; 

namespace copyfile 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 


      string sourceDirectory = @"E:\newversion\Auto TEC"; 
      string targetDirectory = @"C:\Auto TEC"; 

      Copy(sourceDirectory, targetDirectory); 
      label3.Text = "sucess"; 
      loadAssembyNames(); 

     } 

     void f2_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      this.Close(); 
     } 
     public static void Copy(string sourceDirectory, string targetDirectory) 
     { 
      DirectoryInfo diSource = new DirectoryInfo(sourceDirectory); 
      DirectoryInfo diTarget = new DirectoryInfo(targetDirectory); 

      CopyAll(diSource, diTarget); 


     } 

     public static void CopyAll(DirectoryInfo source, DirectoryInfo target) 
     { 
      // Check if the target directory exists, if not, create it. 
      if (Directory.Exists(target.FullName) == false) 
      { 
       Directory.CreateDirectory(target.FullName); 
      } 

      // Copy each file into it's new directory. 
      foreach (FileInfo fi in source.GetFiles()) 
      { 

       fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true); 
      } 

      // Copy each subdirectory using recursion. 
      foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) 
      { 
       DirectoryInfo nextTargetSubDir = 
        target.CreateSubdirectory(diSourceSubDir.Name); 
       CopyAll(diSourceSubDir, nextTargetSubDir); 
      } 

     } 
     string _errMsg; 
     //private AssemblyInformation _info; 
     private void getfilenames(string directoryPath, int location) 
     { 
      string[] path = new string[25]; 
      int count = 0; 
      foreach (string file in System.IO.Directory.GetFiles(directoryPath)) 
      { 
       path[count] = file; 
       count++; 

      } 

      Assembly asm = null; 


       for (int i = 0; i < count; i++) 
       { 
        try 
        { 
         //asm = Assembly.LoadFrom(path[i]); 
         asm = Assembly.LoadFile(path[i]); 
         if (asm != null) 
         { 
          if (location == 1) 
          { 
           listBox1.Items.Add(asm.GetName().Name + asm.GetName().Version.ToString()); 

          } 
          else 
          { 
           listBox2.Items.Add(asm.GetName().Name + asm.GetName().Version.ToString()); 
          } 
         } 
        } 
        catch (Exception err) 
        { 
         this._errMsg = err.Message; 
        } 
       } 

       asm = null; 

       GC.Collect(); 

     } 



     private void Form1_Load(object sender, EventArgs e) 
     { 
      loadAssembyNames(); 

     } 

     private void loadAssembyNames() 
     { 
      listBox1.Items.Clear(); 
      listBox2.Items.Clear(); 
      getfilenames(@"C:\Auto TEC", 1); 

      getfilenames(@"E:\newversion\Auto TEC", 2); 
     } 
    } 
} 

如何卸載從對象的裝配信息?

+0

重複?看看這個http://stackoverflow.com/questions/123391/how-to-unload-an-assembly-from-the-primary-appdomain – goenning 2010-09-30 15:53:14

回答

4

如果不卸載包含它的所有應用程序域,則無法卸載單個程序集。所以你應該使用不同的appdomain foreach你的程序集。

更多信息:

+1

如果我使用AssemblyName.GetAssemblyName(path [i]);它不會加載程序集。它爲我工作。 – hari 2010-09-30 21:10:35

+0

感謝您的回覆 – hari 2010-09-30 21:10:57

1

一旦組件加載它不能被卸載。

您有一個選項可以將字節複製到內存,然後使用Assembly.Load(byte[]).進行加載。您也可以使用FileVersionInfo,這樣更容易。

1

將程序集加載到AppDomain中後無法卸載程序集。唯一的方法是將程序集加載到單獨的AppDomain中,然後卸載整個AppDomain。

只要您從您的AppDomain中的該程序集引用程序集或類型,它就會加載到該AppDomain中,而不是釋放。

1

在.Net中,如果將程序集加載到與應用程序相同的AppDomain中,則無法卸載它(這包括僅爲反射加載它)。如果您需要檢查組件內部,我推薦使用Mono.Cecil(http://www.mono-project.com/Cecil)。

0

我覺得我的時間來回答這個問題,我不是,但我有同樣的問題,以供將來參考你只需要使用「FileVersionInfo.GetVersionInfo」

System.Diagnostics程序

和多數民衆贊成它,這個選項不會載入程序集的信息,你可以替換文件。