2010-04-29 1 views
1

어셈블리를로드하고 해당 어셈블리에서 클래스를 인스턴스화하려고 시도한 다음이 인스턴스 내부에서 속성을 설정해야하는 Run()을 호출하려고합니다.런타임에 어셈블리를로드 할 때 인스턴스에서 호출 된 메서드가 비효율적 인 것 같습니다.

형식을 나열 할 수 있기 때문에 어셈블리를로드해도 문제가없는 것 같지만 호출 된 메서드는 효과가없는 것으로 보입니다. 새 인스턴스에있는 속성은 null로 설정되어 있으며 설정해야한다는 사실을 알립니다. 무언가에.

또한 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(); 
} 
에 위치한 I로드하기 위해 노력하고있어

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

이이 문제를 해결하기 위해 할 수있는 일 : 1) Debug.Write 문을 포함)은 VS.NET 2에서 무엇을보고 같은 코드를 작성하지만, 반사없이 직접 어셈블리를 참조하고 작동하는지 확인 당신이 예상했던대로. – Vitaly

답변

0

어셈블리가 작동한다고 가정하면 여기에 동일한 작업을 수행하는 데 사용한 간단한 코드 조각이 있습니다.

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 
       } 
      } 
     } 
    } 
} 
+0

효과가있었습니다! 고마워. 어셈블리가 실제로 작동하고 원하는 형식의 실제 인스턴스를 반환해야하므로 foreach에서 원하는 형식에 도달 한 후 Activator.CreateInstance()를 호출했습니다. 의견을 보내 주셔서 감사합니다. – amazeas

+0

도움이 된 것을 기쁘게 생각합니다 -이 커뮤니티의 많은 사람들이 나를 도왔습니다. 그래서 할 수있을 때 도움이되도록 노력했습니다. :) – Brandi

관련 문제