2009-09-12 36 views
1

我寫了下面的Utility類來獲取任何類名稱「className」的實例。C#反射實用程序

public class AssemblyUtils 
    { 
     private AssemblyUtils() 
     { 
     } 

     public static T GetInstance<T>(string assemblyName, string className) 
     { 
      T classInstance = default(T); 

      System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(assemblyName); 

      object o = assembly.CreateInstance(className); 

      if (o is T) 
      { 
       classInstance = (T)o; 
      } 
      else 
      { 
       o = null; 
      } 


      return classInstance; 
     } 

我已經叫這個名字:

IMyInterface ins = AssemblyUtils.GetInstance<IMyInterface>(@"MyNamespace.DA.dll", "MyClassDA"); 

但我收到以下錯誤消息:

Could not load file or assembly 'MyNamespace.DA.dll' or one of its dependencies. The system cannot find the file specified. 

需要注意的是,我打電話從單獨的程序集的AssemblyUtils.GetInstance()它們在同一個sln中。

我該如何解決組裝路徑?

回答

5

我的猜測是,它無法找到組件,因爲它不是在同一個文件夾中,而不是在GAC,或者系統正在尋找其他目錄。

您需要將它們移動到執行程序集所在的相同文件夾中。您可以使用AppDomainSetup.PrivateBinPath Property更改加載程序集的文件夾。

+0

PrivateBinPath只能設置爲應用程序的基本目錄下的文件夾。它不能設置爲任何文件夾。因此,只要程序集位於應用程序的文件夾層次結構中,就可以工作。 –

+0

@Mike二。好點子。感謝您的澄清。 – Vadim

1

我想,你要加載的組件(MyNamespace.DA.dll)是依賴於它不位於你的文件夾,你正在尋找另一個組件。將相關程序集複製到MyNamespace.DA.dll程序集所在的文件夾中。

1

檢查你的bin \ Debug文件夾,是該文件夾中MyNamespace.DA.dll?如果沒有,你將不得不手動將它移動到那裏。也許增加一個後置條件,使其自動複製。也嘗試使用完整的程序集強名稱。

而且JMSA,如何在你的其他線程一些upvotes和接受的答案?

+0

好的哥們!你說對了。但是,你能否給我一個最後一票,以便消極點被平等化? – anonymous

+0

我認爲你的問題是公平的,已經做到了 - 在-2。 –

1

由於瓦迪姆提到Assembly.Load只會看一組有限的地方。 Assembly.LoadFrom對你來說可能是一個更好的選擇。它需要一個路徑(帶有文件名)到程序集。

Assembly.Load使用程序集名稱,而不是路徑。