2011-05-27 56 views
3

動態加載的程序集我都在其中,我編寫C#腳本到使用CodeDomProvider內存組件一個.NET項目在這裏的情況。引用在動態編譯代碼

在我使用的編譯CompilerParameters類,我按標題(System.dll中,另一種是項目的一部分)和到目前爲止的所有作品涉及到一些組件。然而,一些腳本正在使用一些代碼(通過接口和多態),這些代碼在預編譯但是從磁盤動態加載(如插件)的程序集中找到。在這種情況下,它將無法工作,問題是我不知道如何在動態編譯腳本時引用動態加載的程序集。

如果我將腳本放入類庫並從該類庫引用插件程序集,它一切正常,但如果將插件程序集(dll文件)的名稱添加到在CompilerParameters中引用的程序集並在之後動態編譯腳本,腳本將被執行,但位於插件dll中的代碼不是。

我希望這是清楚我想在這裏做,請幫助,如果你知道這事,因爲我掙扎一段時間以來並沒有什麼,我都試過的作品。

謝謝!

編輯:這是用於加載DLL插件代碼:

 DirectoryInfo di = new DirectoryInfo(@".\Plugins"); 
     FileInfo[] files = di.GetFiles("*.dll"); 
     foreach (FileInfo fi in files) 
     { 
      try 
      { 
       //load all dll files from the app pack directory 
       Assembly asm = Assembly.LoadFrom(fi.FullName); 
       Assemblies.Add(asm); 
       foreach (Type type in asm.GetTypes()) 
       { 
        try 
        { 
         object instance = null; 
         instance = Activator.CreateInstance(type); 

這之後我的實例存儲在一個字典進一步使用。在另一邊,這裏是我嘗試將引用傳遞給將被編譯腳本:

 CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
     List<string> referenceAssemblies = new List<string>(); 
     referenceAssemblies.Add("System.dll"); 
     referenceAssemblies.Add("VFS.dll"); 
     foreach (Assembly asm in PluginManager.Instance.Assemblies) 
     { 
      referenceAssemblies.Add(asm.Location); 
     } 
     CompilerParameters compilerParameters = new CompilerParameters(referenceAssemblies.ToArray()); 

這個作品,如果我不使用任何類,它是一個插件的一部分。

+0

當內存組件執行的(而且據稱將調用所引用的DLL)沒有異常拋出,但在同一時間內未執行的代碼?當然* *正在發生... – insipid 2011-05-27 19:34:54

+0

你可以給你一些代碼,你用來加載插件的DLL? – 2011-05-27 22:43:53

+0

我已經添加了一些關於如何執行插件加載以及如何指定對編譯器的引用的代碼。 – 2011-05-30 06:53:25

回答

0

我已經發現了這個問題,它是在不同的區域,這部分工作正常。

@Insipid - 感謝您的鼓舞人心的答案,因爲沒有什麼實際上正在發生,這是什麼讓我看着另一個地方,看到這個問題。

我上面貼的代碼工作得很好,並且可以使用,如果有人想實現在未來這種機制。