C # - загрузка сборки во время выполнения, вызываемый метод экземпляра кажется неэффективным - PullRequest
1 голос
/ 29 апреля 2010

Я пытаюсь загрузить сборку, создать экземпляр класса из этой сборки, а затем вызвать Run (), которая должна установить свойство внутри этого экземпляра.

Загрузка сборки, кажется, работает нормально, так как я могу перечислить типы, но вызываемый метод кажется неэффективным: свойство, расположенное в новом экземпляре, остается равным нулю, несмотря на тот факт, что оно должно быть установлено на что-то.

Я также пытался вызвать метод с использованием синтаксиса type.InvokeMethod (...).

Метод, который загружает сборку, вызывает конструктор и вызывает метод:

private IEntryPoint ChargerAppli(AppInfo ai)
{
        string cheminAssemblies = "D:\\TFS\\OBL Microsoft\\Stages\\2010\\WPF\\Shell\\Shell\\Applications\\";

        Assembly a = Assembly.LoadFile(cheminAssemblies + ai.AssemblyName);
        Type type = a.GetType(ai.StartupClass);

        IEntryPoint instance = Activator.CreateInstance(type) as IEntryPoint;
        instance.Run();
        return instance;
}

Интерфейс IEntryPoint:

public interface IEntryPoint
{
    FrameworkElement HostVisual { get; set; }
    void Run();
}

Реализация IEntryPoint, которую я пытаюсь загрузить, находится в новой сборке:

class Bootstrap : IEntryPoint
{
    private FrameworkElement _visuel;

    public Bootstrap()
    {
        //do some work;
        this._visuel = new MainVisual();
    }

    public System.Windows.FrameworkElement HostVisual { get; set; }

    public void Run()
    {
        HostVisual = this._visuel;
    }
}

Чего мне не хватает?

1 Ответ

0 голосов
/ 29 апреля 2010

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

 Assembly assembly = Assembly.LoadFile(file);
 Type[] types = assembly.GetTypes();
 foreach (Type t in types)
 {
    MethodInfo[] methods = t.GetMethods();

   if (t.Name == "MyType")
   {
       foreach (MethodInfo method in methods)
       {
           if (method.Name == "Run")
           {
               try
               {
                   InterfaceToMyType activeModule = ("InterfaceToMyType")method.Invoke(null, args);
               }
               catch
               {
                    //do stuff here if needed
               }
           }
       }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...