Загрузите пользовательский контроль из папки программно - PullRequest
0 голосов
/ 04 ноября 2018

Я искал, чтобы загрузить usercontrol из папки. Я хочу, чтобы люди могли упаковать расширение для моего приложения. Для этого им нужно будет создать пользовательский элемент управления c # и поместить дизайнер, код и файл resx в папку. Затем, когда они захотят использовать свое «расширение», они выберут папку из селектора папок (у меня это есть) и мое приложение загрузит их расширение. Я хочу специально вытащить пользовательский элемент управления и привести его к объекту usercontrol. Могу ли я это сделать, и если да, то как?

Я посмотрел в интернете, и, похоже, этот вопрос не совсем подходит. Я не смог создать сценарий, который мог бы выполнить это. Я даже не знаю, с чего начать. Я знаю, что должен скомпилировать их usercontrol.

Если это невозможно, следующее лучшее решение, о котором я могу подумать, - это, возможно, предварительно скомпилированный пользовательский контроль. Если это возможно, как я могу загрузить это?

Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2018

Если вы хотите скомпилировать исходники, это можно сделать с помощью System.CodeDom. Кроме этого, вы должны загрузить типы из сборки и проверить, есть ли там UserControl, загрузить его и добавить в форму.

Вот пример того, что я описал:

public void LoadPlugin(params string[] sourceCodeFilesForUserControl)
{
    // Compile the source files
    CSharpCodeProvider codeProvider = new CSharpCodeProvider();
    CompilerParameters parameters = new CompilerParameters();
    parameters.IncludeDebugInformation = true;
    parameters.GenerateInMemory = true;
    // Add references that they can use
    parameters.ReferencedAssemblies.Add("System.dll");
    parameters.ReferencedAssemblies.Add("System.Core.dll");
    parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); // important for UserControl 
    parameters.TreatWarningsAsErrors = false;

    CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sourceCodeFilesForUserControl);
    if (results.Errors.Count > 0)
    {
        // Handle compile errors
        StringBuilder sb = new StringBuilder();
        foreach (CompilerError CompErr in results.Errors)
        {
            sb.AppendLine("Line number " + CompErr.Line +
                          ", Error Number: " + CompErr.ErrorNumber +
                          ", '" + CompErr.ErrorText + ";");
        }

        Console.Write(sb.ToString());
    }
    else
    {
        // The assembly we can search for a usercontrol
        var assembly = results.CompiledAssembly;
        // If the assembly was already compiled you might want to load it directly:
        // assembly = Assembly.LoadFile(@"C:\Program Files\MyTool\plugins\someplugin.dll");


        // Get the first type in the assembly that is a UserControl
        var userControl = assembly.GetTypes().FirstOrDefault(x => x.BaseType == typeof(UserControl));

        // Create a instance of the UserControl
        var createdUserControl = Activator.CreateInstance(userControl, new object[] { }) as UserControl;

        // Add the created UserControl to the current form
        this.Controls.Add(createdUserControl);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...