Я пытаюсь загрузить UserControl из URL-адреса sharepoint, но у меня нет ссылки на сборку в GAC. Вместо этого я загружаю его содержимое из базы данных в текущий AppDomain, используя Assembly.Load (byte []). Я также добавил событие AssemblyResolver, которое возвращает мою загруженную библиотеку DLL, чтобы она могла получить правильный контекст.
Код работает нормально для обычных библиотек DLL.
Когда я пытаюсь загрузить UserControl, я получаю сообщение «не могу загрузить сборку или одну из ее ссылок», когда только основная dll находится в GAC или нулевая ссылка в System.CodeDom.Compiler.CodeDomProvider.TryGetProbableCoreAssemblyFilePath (параметры CompilerParameters, String & coreAssemblyFilePath), когда обе библиотеки находятся в базе данных и только ascx находится в макетах sharepoint.
То, чего я пытаюсь добиться, - это загрузить элемент управления ascx во время выполнения с динамически загруженными сборками или только с основной сборкой в sharepoint GAC и ссылочной ссылкой из отражения.
Вот мой код:
Загрузка сборки в appdomain.
if (files.Query.Load())
{
if (_filesFullNameId.ContainsKey(files.Current.FullName))
return result;
Assembly.Load(files.Current.Content);
result.Add(new KeyValuePair<string, int>(files.Current.FullName, fileId));
}
Событие резольвера добавлено в одноэлементный кеш-конструктор для текущего домена приложения:
private Assembly AssemblyResolver(object sender, ResolveEventArgs args)
{
var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName == args.Name);
if (assembly == null && args.RequestingAssembly != null)
{
LoggingProvider.Logger.WriteToEventLog(new WriteToSystemLogParams
{
//log
});
}
return assembly;
}
И LoadControl, выполняемый на службе sharepoint:
SPSecurity.RunWithElevatedPrivileges(
() =>
{
PluginAssemblyCache.Instance.LoadPackageById(MainContext.Instance.GetCurrentDbInfo(), packageId);
var control = page.LoadControl(url);
if (control != null)
{
var type = control.GetType().BaseType;
metadata.SpTypeName = type.FullName;
metadata.AssemblyName = type.Assembly.FullName;
}
});