如何告訴我的.NET應用程序在哪裏尋找它需要的特定程序集(除了GAC或應用程序運行所在的文件夾)? 例如,我想將程序集放在用戶的Temp文件夾中,並讓我的應用程序知道引用的程序集位於temp文件夾中。在不同的地方尋找.NET程序集
感謝
如何告訴我的.NET應用程序在哪裏尋找它需要的特定程序集(除了GAC或應用程序運行所在的文件夾)? 例如,我想將程序集放在用戶的Temp文件夾中,並讓我的應用程序知道引用的程序集位於temp文件夾中。在不同的地方尋找.NET程序集
感謝
可以使用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;
}
對於一些涉及的問題參見本討論:
http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading
基本上,它已被創建之後不能更改的 程序域的應用平臺。您必須先指定它作爲 配置的一部分,然後再創建一個新配置,該配置在默認的 appdomain中不會對您有所幫助。
如果要加載程序集是在當前 應用平臺下的目錄,然後你可以添加使用 AppendPrivatePath(relativePath)的相對路徑,然後用Assembly.Load - 運行時 會探測子目錄您。這是 處理它的最好/最簡單的方法。
謝謝,就像一個筆記我不需要動態加載它。我在我的項目中引用程序集。但是當我部署該應用程序時,我希望應用程序知道引用的程序集將位於臨時文件夾 – 2009-10-13 17:49:00
System.Reflection.Assembly.LoadFrom(myFile);
http://msdn.microsoft.com/en-us/library/1009fa28.aspx
另一種方法是處理大會自己解決事件,在這個StackOverflow的問題:How to add folder to assembly search path at runtime in .NET?
中。正如[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
感謝您的建議。 – 2013-04-04 13:49:59