我對c#和.NET頗爲陌生,並試圖創建一個動態加載程序集的asp.net web應用程序。c#.NET加載/卸載程序集,同時保持相同的會話
最初,我用Activator.CreateInstance
動態加載程序集,但它似乎鎖定程序集DLL文件。因爲我經常改變大會,所以變得非常痛苦。我還需要與其他應用程序共享程序集,因此稍後可能會成爲問題。
看來,大多數人建議創建一個單獨的AppDomain並將程序集加載到它中,然後在完成後卸載AppDomain。但是,我的應用程序和程序集也依賴於會話上下文,一旦將它發送到應用程序域,所有會話都會丟失;程序集崩潰,因爲它找不到會話上下文。
有沒有辦法將我的會話上下文傳遞給AppDomain?或者有沒有什麼辦法可以加載程序集而不鎖定DLL文件?我嘗試按照某些建議的流式傳輸文件,但它仍然鎖定DLL。
編輯:我試過下面的代碼爲達維德Piras酒店建議,但DLL文件仍然鎖定
private static T CreateInstance<T>(string fileName, string typeName)
{
if (!File.Exists(fileName)) throw new FileNotFoundException(string.Format("Cannot find assembly '{0}'.", fileName));
try
{
Assembly assembly = Assembly.LoadFrom(fileName);
if (assembly != null)
{
List<Type> assemblyTypes = assembly.GetTypes().ToList();
Type assemblyType =
assemblyTypes.FirstOrDefault(asmType => typeof(T).IsAssignableFrom(asmType));
T instance = (T) Activator.CreateInstance(assemblyType);
if (instance != null) return instance;
}
// Trouble if the above doesn't work!
throw new NullReferenceException(string.Format("Could not create type '{0}'.", typeName));
}
catch (Exception exp1)
{
throw new Exception("Cannot create instance from " + fileName + ", with type " + typeName + ": " + exp1.Message + exp1.Source, exp1.InnerException);
}
}
看到我的編輯和更多的代碼就快到了:) –