Как загрузить сборку в память и выполнить ее - PullRequest
6 голосов
/ 30 апреля 2011

Вот что я делаю:

byte[] bytes = File.ReadAllBytes(@Application.StartupPath+"/UpdateMainProgaramApp.exe");
Assembly assembly = Assembly.Load(bytes);
// load the assemly

//Assembly assembly = Assembly.LoadFrom(AssemblyName);

// Walk through each type in the assembly looking for our class
MethodInfo method = assembly.EntryPoint;
if (method != null)
{
    // create an istance of the Startup form Main method
    object o = assembly.CreateInstance(method.Name);
    // invoke the application starting point
    try
    {
        method.Invoke(o, null);
    }
    catch (TargetInvocationException e)
    {
        Console.WriteLine(e.ToString());
    }
}

Проблема в том, что он выдает TargetInvocationException - он находит, что метод является основным, но он выдает это исключение, так как в этой строке:

object o = assembly.CreateInstance(method.Name);

o остается нулевым. Поэтому я немного углубился в эту трассировку стека, и фактическая ошибка такова:

InnerException = {"SetCompatibleTextRenderingDefault следует вызывать перед созданием первого первого объекта IWin32Window в программе"} (это мой перевод, так как он дает мне трассировку стека на половине иврита на половине английского, поскольку мои окна на иврите.)

Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 30 апреля 2011

Метод точки входа является статическим, поэтому его следует вызывать с использованием нулевого значения для параметра «экземпляр». Попробуйте заменить все после строки Assembly.Load следующим текстом:

assembly.EntryPoint.Invoke(null, new object[0]);

Если метод точки входа не является общедоступным, следует использовать перегрузку Invoke, которая позволяет указать BindingFlags.

1 голос
/ 30 апреля 2011

если вы проверите любой файл Program.cs приложения WinForm, вы всегда увидите эти 2 строки

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

вам также нужно вызывать их в вашей сборке. По крайней мере, так говорит твое исключение.

0 голосов
/ 30 апреля 2011

Как насчет вызова в собственном процессе ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...