Я делаю паутину. сервис, который загружает файл сборки по входному параметру. Затем в сборке попытается найти определенный тип (унаследованный от определенного интерфейса), создать экземпляр и вернуть результат метода.Загрузка и разгрузка сборки в собственном AppDomain
Мне нужно, чтобы звонок к сборке был снова выпущен.
Из входных параметров метода я нахожу путь к сборке в web.config. и попробуйте загрузить его.
Это код, который работает:
[WebMethod]
public String[] GetData(String confKey)
{
var assemblyPath = ConfigurationManager.AppSettings[confKey];
var assembly = Assembly.LoadFrom(assemblyPath);
List<String> retVals = new List<String>();
foreach (var t in assembly.GetTypes())
{
if (t.ImplementsInterface(typeof(IMyServiceProvider)))
{
IMyServiceProvider objectInstance = Activator.CreateInstance(t) as IMyServiceProvider;
retVals.Add(objectInstance.GetData());
}
}
return retVals.ToArray();
}
Но этот способ можно удалить загруженную сборку или заменить его, так как файл «заблокирован».
Так что я попытался пойти другим путем и загрузить сборку в собственный AppDomain, как это:
[WebMethod]
public String[] GetData(String confKey)
{
var assemblyPath = ConfigurationManager.AppSettings[confKey];
var tmp = String.Concat("AppDomain", Guid.NewGuid().ToString("N"));
AppDomain dom = AppDomain.CreateDomain(tmp, null, AppDomain.CurrentDomain.SetupInformation);
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = assemblyPath;
Assembly assembly = dom.Load(assemblyPath);
List<String> retVals = new List<String>();
foreach (var t in assembly.GetTypes())
{
if (t.ImplementsInterface(typeof(IMyServiceProvider)))
{
IMyServiceProvider objectInstance = Activator.CreateInstance(t) as IMyServiceProvider;
retVals.Add(objectInstance.GetData());
}
}
AppDomain.Unload(dom);
return retVals.ToArray();
}
Но это решение выбрасывается исключение:
Не удалось загрузить файл или сборку «NameOfMyAssembly 'или одной из его зависимостей. Данное имя сборки или кодовая база недействительны. (Исключение из HRESULT: 0x80131047) - на System.Reflection.AssemblyName.nInit (RuntimeAssembly & сборки, булевой forIntrospection, Boolean raiseResolveEvent) в System.Reflection.RuntimeAssembly.CreateAssemblyName (String assemblyString, Boolean forIntrospection, RuntimeAssembly & assemblyFromResolveEvent) в системе .Reflection.RuntimeAssembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) на System.Reflection.RuntimeAssembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) в системе. AppDomain.Load (String assemblyString) в System.AppDomain.Loa d (Строка assemblyString)
Почему первая сборка решения загружается без проблем, а вторая вызывает ошибку?
Почему не используя MEF и динамически загружать все библиотеки? – Venson