Загрузка сборки usercontrol по ссылке путем отражения - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь загрузить 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;                            
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...