2009-10-13 16 views
6

如何告訴我的.NET應用程序在哪裏尋找它需要的特定程序集(除了GAC或應用程序運行所在的文件夾)? 例如,我想將程序集放在用戶的Temp文件夾中,並讓我的應用程序知道引用的程序集位於temp文件夾中。在不同的地方尋找.NET程序集

感謝

回答

6

可以使用AppDomain.AssemblyResolve事件添加自定義組件的解析器。這允許您指向其他目錄甚至數據庫以根據需要獲取程序集。

我甚至使用類似的代碼從數據庫下載程序集並存儲在IsolatedStorage中。文件名稱作爲完整程序集名稱的散列。然後數據庫只需要在您第一次解決時下載,並且所有未來的解決方案都將由文件系統提供。有關AssemblyResolve事件的最佳方法是您可以使用Type.GetType()和內置的序列化程序。

static string lookupPath = @"c:\otherbin"; 

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += 
     new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
} 

static Assembly CurrentDomain_AssemblyResolve(object sender, 
               ResolveEventArgs args) 
{ 
    var assemblyname = new AssemblyName(args.Name).Name; 
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll"); 
    var assembly = Assembly.LoadFrom(assemblyFileName); 
    return assembly; 
} 
+1

中。正如[here](http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-提示),使用'string assemblyname = new AssemblyName(args.Name).Name;'而不是使用Split(',')'。 – kroimon 2013-04-04 12:38:44

+0

感謝您的建議。 – 2013-04-04 13:49:59

3

對於一些涉及的問題參見本討論:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

基本上,它已被創建之後不能更改的 程序域的應用平臺。您必須先指定它作爲 配置的一部分,然後再創建一個新配置,該配置在默認的 appdomain中不會對您有所幫助。

如果要加載程序集是在當前 應用平臺下的目錄,然後你可以添加使用 AppendPrivatePath(relativePath)的相對路徑,然後用Assembly.Load - 運行時 會探測子目錄您。這是 處理它的最好/最簡單的方法。

+0

謝謝,就像一個筆記我不需要動態加載它。我在我的項目中引用程序集。但是當我部署該應用程序時,我希望應用程序知道引用的程序集將位於臨時文件夾 – 2009-10-13 17:49:00

相關問題