2013-07-29 4 views
0

동일한 솔루션과 네임 스페이스에 winform 응용 프로그램과 서비스 DLL (C#)이 있습니다. DLL을 동적으로로드하므로 향후 DLL을 업데이트 할 수 있습니다. 기본 폼은 동적으로로드 된 DLL에서 메서드를 호출하고 자체 (this)를 변수로 전달합니다. 기본 폼에동적으로로드 된 DLL에서 호출 된 메서드에서 호출 양식을 참조하는 방법

코드 : DLL에서

namespace MyNamespace 
{ 
    class Form1 
    { 
     int i = 5; 
     // Code 
     ..... 

     private void CallDllMethod() 
     { 
      try 
      { 
       Assembly assembly = Assembly.LoadFrom("DllName.dll"); 
       Type type = assembly.GetType("MyNamespace.Class2"); 

       object ClassObj = Activator.CreateInstance(type); 
       type.InvokeMember("DoSomething", 
            BindingFlags.Default | BindingFlags.InvokeMethod, 
            null, 
            ClassObj, 
            new object[] { this }); 
      } 
      catch (Exception){...}  
     } 
    } 
} 

코드 : 그것은 나에게 말한다

namespace MyNamespace 
{ 
    public class Class2 
    { 
     public void DoSomething(Form1 obj) 
     { 
        ... 
     } 
    } 
} 

Form1 obj을 모르는 나는 내가 이유를 이해 생각.

dll이 기본 양식을 "알기"때문에 구성원 및 방법과 상호 작용할 수 있도록하려면 어떻게해야합니까 ?? 이 목표를 달성하기위한 더 좋은 방법이 있습니까?

감사합니다 당신에게

답변

1

DLL은 EXE 파일의 프로젝트에 대한 참조 (또는 기본 클래스 또는 인터페이스를 정의하는 3 프로젝트)가 필요합니다 그 구성원을 얻기 위해 EXE와 DLL 참조) 모두 디자인 타임에.

리플렉션을 사용하여 멤버를 호출 할 수 없다면 막을 수 있습니다.

dll에서 기본 양식 멤버 만 액세스해야하는 경우 Form1 대신 인수를 Form으로 선언 할 수 있습니다. 그러면 .Close과 같은 전화를 걸 수 있습니다.

+0

내가 제안한대로 결국 프로젝트의 exe를 참조하고 작동합니다. 호기심 때문에 처음에는 리플렉션 (exe를 참조하기 전에)을 사용하고 main.format에서'type.GetMethod ("funcName")을 사용하여 public 메소드를 호출했습니다.); ',하지만 공공의 구성원과 그들의 내부 가치에 접근 할 수있는 방법을 찾지 못했습니다. 방법이 있습니까? – Yoram

+1

적절한 버전의'Type.GetMember','Type.GetField','Type.GetConstructor' 등을 사용하여 속성, 필드 및 메서드에 액세스 할 수 있습니다. 또한 public이 아닌 메서드를 가져올 수 있습니다.) 당신이 원하는 가시성 수준을 나타내는'BindingFlags'를 전달함으로써. –

+0

고마워, 나는 그것을 시도 할 것이다. – Yoram

관련 문제