2012-01-01 4 views
2

은 플러그 인이 PlugIn.dll로 끝나는 콘솔 응용 프로그램을 만들었습니다. 은 dll 어셈블리를로드하고 PlugIn.dll에서 plugInClass의 메서드를 작성합니다. write 메서드가 포함 된 IWrite라는 인터페이스를 만들었습니다. 'ConsolePlugIn.IWrite'를 입력 유형 'HPlugIn.plugInClass'의 개체를 캐스팅 할 수 없습니다플러그인 응용 프로그램에서 캐스팅 오류가 발생했습니다.

: 아래 주어진 콘솔 응용 프로그램을 실행 한 후, 에러를 제공합니다. 여기

여기

using System; 
using System.IO; 
using System.Reflection; 
namespace ConsolePlugIn 
{ 
    interface IWrite 
    { 
     void write(); 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      foreach (string s in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*PlugIn.dll"))//getting plugins in base directory 
      { 
       Assembly aWrite = Assembly.LoadFrom(s); 
       Type tWrite = aWrite.GetType("HPlugIn.plugInClass"); 
       IWrite click = (IWrite)Activator.CreateInstance(tWrite);//giving casting error 
       click.write(); 
      } 
     } 
    } 
} 

는 플러그인 DLL 파일

using System; 
namespace HPlugIn 
{ 
    interface IWrite 
    { 
     void write(); 
    } 
    public class plugInClass : IWrite 
    { 
     public void write() 
     { 
      Console.Write("High from plugInClass"); 
     } 
    } 
} 

이 캐스팅 오류에 대한 어떤 생각이 내 코드입니다 [주요 응용 프로그램] .. 콘솔 응용 프로그램에 대한 내 코드? 미리 감사드립니다.

답변

1

EXE와 DLL에있는 IWrite 인터페이스는 구조가 동일하더라도 같지 않습니다. 인터페이스로 세 번째 dll을 만들어 DLL과 EXE에서 공유해야합니다.

공통 :

namespace Shared { 
    interface IWrite { 
     void write(); 
    } 
} 

DLL :

using System; 
using Shared; 
namespace HPlugIn { 
    public class plugInClass : IWrite { 
     public void write() { 
      Console.Write("High from plugInClass"); 
     } 
    } 
} 

EXE : 당신은 2 개의 다른 어셈블리에 두 번 IWrite 인터페이스를 정의

using System; 
using System.IO; 
using System.Reflection; 
using Shared; 
namespace ConsolePlugIn { 
    class Program { 
     ... 
    } 
} 
+0

오 ... 그래서 d 인터페이스의 ID는 dll과 exe..right에 동일해야합니다. – Anirudha

+0

@Anirudha 이것은 맞습니다. – dasblinkenlight

1

. 그들은 다른 유형으로 간주되며 당신은 하나에서 다른 하나로 캐스팅 할 수 없습니다. EXE와 어셈블리 간의 더 약한 결합을 달성하는 가장 좋은 방법은이 인터페이스를 별도의 DLL로 정의하는 것입니다. 그런 다음 플러그인과 실행 가능 파일 모두 계약 (IWrite 인터페이스)을 포함하는이 세 번째 어셈블리를 참조하게하십시오.

1

IWrite 인터페이스가 두 가지입니다. 하나는 콘솔 앱에, 하나는 dll에 있습니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다.

  • dll은 콘솔 앱을 참조하고 plugInClassConsolePlugIn.IWrite 인터페이스를 구현해야합니다.
  • dynamic 키워드를 사용하면 동일한 일치를 보이는 인터페이스를 만들 수 있습니다.
관련 문제