2011-08-08 65 views
5

我有孩子的應用程序域,我想在啓動和發佈文件時加載一些dll庫,這樣任何人都可以刪除它們。將程序集加載到子AppDomain併發布dll文件

在啓動時我對下面的類做

Loader al = (Loader)domain.CreateInstanceAndUnwrap(
typeof(Loader).Assembly.FullName, 
typeof(Loader).FullName); 
al.Load(path) 

class Loader : MarshalByRefObject 
{ 
    internal void Load(string path) 
    { 
     Assembly assembly; 
     try 
     { 
      assembly = Assembly.Load(File.ReadAllBytes(path)); 
     } 
     catch (Exception) { return; } 
    } 
    internal UseType(string fullyQualifiedTypeName) 
    { 
     Type userType = Type.GetType(fullyQualifiedTypeName); 
    } 
} 

後來我調用UseType,我得到了正確的類型,但我不能夠刪除的文件了,因爲它是因爲如果孩子應用程序域已鎖定DLL。

基本上我想實現的是在啓動時緩存程序集文件,然後使用GetType調用,以便實際的dll文件將被釋放。

真的有可能實現這樣的事情嗎?

+0

CreateInstanceAndUnwrap()獲取加載到主appdomain中的類型。其中鎖定該文件。使用在單獨程序集中定義的接口類型。 –

+0

我可以讓包含Loader的文件被鎖定。或者Loader的方法中使用的任何類型都會使它的程序集在父應用程序域中加載? – Egor

+0

另請參閱:http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins

回答

5

創建應用程序域時使用卷影副本。將dll複製到緩存中,任何人都可以與文件系統進行交互。

Topshelf在我們的貨架上做了這件事(當時所有東西都在它自己的應用程序域中) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126

更新:Topshelf不再這樣做,但更新了一個鏈接到一個版本。

+0

感謝您的回答! – Egor

+0

沒問題,希望它有幫助! – Travis

+0

是的,它幫助!如果庫來自自定義源,則只需要設置ShadowCopyDirectories屬性。 – Egor

相關問題