Я новичок в C # и .NET и пытаюсь создать веб-приложение asp.net, которое динамически загружает сборку.
Первоначально я использовал Activator.CreateInstance
для динамической загрузки сборок, но похоже, что это блокирует файл DLL сборки. Поскольку я вношу частые изменения в сборку, это стало настоящей болью. Мне также нужно поделиться сборкой с другими приложениями, так что позже это может стать проблемой.
Похоже, что большинство людей рекомендуют создать отдельный домен приложения и загрузить в него сборку, а затем выгрузить домен приложения после того, как я закончу. Однако мое приложение и сборка также зависят от контекста сеанса, и весь сеанс теряется, когда я отправляю его в домен приложения; сборка вылетает, потому что не может найти контекст сеанса.
Есть ли способ передать контекст моего сеанса в AppDomain? Или у меня есть способ загрузить сборку без блокировки файла DLL? Я попытался передать файл в потоковом режиме, как некоторые предлагали, но он по-прежнему блокирует DLL.
Изменить: я пробовал следующий код, как предложил Давид Пирас, но файл 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);
}
}