2013-08-02 69 views
1

我有一個問題,我真的不知道爲什麼它不起作用。我讀過很多教程(也在stackoverflow上),但仍然沒有任何內容。ShadowCopy程序集

我的目標是對某些.dll文件(它們尚未被任何程序使用)反射,並獲得繼承類型,方法,構造函數等。一切正常,但問題在於dll被鎖定並且無法刪除直到我關閉程序。這是我嘗試解決問題的代碼的一部分。

var apds = new AppDomainSetup(); 
apds.ApplicationName = "MyAssemblies"; 
Evidence adevidence = AppDomain.CurrentDomain.Evidence; 

AppDomain apd = AppDomain.CreateDomain("newdomain", adevidence, apds); 
apd.AppendPrivatePath("Assemblies"); 
apd.SetCachePath("C:\\Cache"); 
apd.SetShadowCopyFiles(); 
foreach (var type in apd.Load(AssemblyName.GetAssemblyName(file.Path)).GetTypes()) 
{ 
     foreach (var inherits in GetInheritanceHierarchy(type)) 
     { //rest is ok 

我知道我使用了一些不推薦的方法,但它是其中的一種嘗試。 Dll被成功複製到緩存目錄中,但它們似乎也被加載到當前域中。 問題在哪裏? 在此先感謝。


我修改了代碼,並使用Loader類,但我仍然有鎖定的文件。

class Loader : MarshalByRefObject 
{ 
    public Assembly assembly; 
    public void LoadAssembly(string path) 
    { 
     assembly = Assembly.Load(AssemblyName.GetAssemblyName(path)); 
    } 
    public Types[] getTypes() 
    { 
     return assembly.getTypes(); 
    } 
} 
//... 
if (file.Type == ".dll") 
{ 
    var apds = new AppDomainSetup 
    { 
      ApplicationName = "MyAssemblies", 
      ApplicationBase = Path, 
      ShadowCopyFiles = "true", 
      ShadowCopyDirectories = Path 
    }; 
    AppDomain apd = AppDomain.CreateDomain("newdomain", null, apds); 
    Loader loader = (Loader)apd.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName); 
    loader.LoadAssembly(file.Path);   
    foreach (var type in loader.getTypes()) 
    { 
      foreach (var inherits in GetInheritanceHierarchy(type)) 
//... 

任何想法?

+0

組件被加載到您當前的域中,因爲您正在'Load'調用中明確這樣做。如果您更仔細地閱讀教程,您會看到教程運行的代碼將程序集加載到新的域中...... –

回答

2

您可以通過以下方式加載組件。

var types = Assembly.Load(File.ReadAllBytes("YourAssembly.dll")).GetTypes(); 

現在您可以從程序集中提取類型,並且可以在應用程序仍在運行時刪除程序集。

+0

這幫助我動態地調用庫dll的負載,並在需要時進行更改,而無需重新發布。會不會有內存問題 –