2010-04-26 84 views
18

我正在嘗試將加載到控制檯應用程序的DLL中,然後卸載它並完全刪除文件。我遇到的問題是,在自己的AppDomain中加載dll的行爲會在Parent AppDomain中創建一個引用,從而不允許我銷燬該dll文件,除非我完全關閉該程序。任何想法使這個代碼工作?在新AppDomain中加載程序集而不將其加載到父AppDomain中

string fileLocation = @"C:\Collector.dll"; 
AppDomain domain = AppDomain.CreateDomain(fileLocation); 
domain.Load(@"Services.Collector"); 
AppDomain.Unload(domain); 

BTW我自己也嘗試這個代碼沒有運氣或者

string fileLocation = @"C:\Collector.dll"; 
byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation); 

AppDomainSetup domainSetup = new AppDomainSetup(); 
domainSetup.ApplicationBase = Environment.CurrentDirectory; 
domainSetup.ShadowCopyFiles = "true"; 
domainSetup.CachePath = Environment.CurrentDirectory; 
AppDomain tempAppDomain = AppDomain.CreateDomain("Services.Collector", AppDomain.CurrentDomain.Evidence, domainSetup); 

//Load up the temp assembly and do stuff 
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer); 

//Then I'm trying to clean up 
AppDomain.Unload(tempAppDomain); 
tempAppDomain = null; 
File.Delete(fileLocation); 

回答

5

行,所以我在這裏解決我自己的問題。顯然,如果您調用AppDomain.Load,它會將其註冊到您的父AppDomain。簡而言之,答案就是不要參考它。這是鏈接到一個網站,顯示如何正確設置它。

https://bookie.io/bmark/readable/9503538d6bab80

+1

這個鏈接是死了! – ZioN

+5

請您提供代碼 – ZioN

+0

新鏈接:https://bmark.us/bmark/readable/9503538d6bab80 – user1

4

這應該是很容易:

namespace Parent { 
    public class Constants 
    { 
    // adjust 
    public const string LIB_PATH = @"C:\Collector.dll"; 
    } 

    public interface ILoader 
    { 
    string Execute(); 
    } 

    public class Loader : MarshalByRefObject, ILoader 
    { 
    public string Execute() 
    { 
     var assembly = Assembly.LoadFile(Constants.LIB_PATH); 
     return assembly.FullName; 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     var domain = AppDomain.CreateDomain("child"); 
     var loader = (ILoader)domain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName); 
     Console.Out.WriteLine(loader.Execute()); 
     AppDomain.Unload(domain); 
     File.Delete(Constants.LIB_PATH); 
    } 
    } 
} 
+0

沒有用。當我嘗試刪除文件時,出現未經授權的訪問異常。你測試了你的代碼嗎? –

+0

@WolfgangRoth - 它對我有用。如果您遇到特定問題,我建議您提出一個新問題。 –

+0

我解決了我的問題:實際上,visual studio debugger在調試時將自身​​連接到程序集,並且它不再斷開連接。但是,當我運行時沒有調試器或當我第一次加載到一個字節數組的程序集文件,一切工作正常... –

相關問題