Assembly.Loadfrom을 사용하여 응용 프로그램과로드 플러그인 어셈블리에 대한 플러그인 프레임 워크를 구현합니다. 그런 다음 GetTypes()를 사용하여 지원되는 인터페이스의 각 플러그인 파일 유형을 자세히 검사합니다.Assembly.GetTypes() - ReflectionTypeLoadException
플러그인에 대한 경로가 사용자에 의해 제공되며 폴더의 각 파일을 순환하여 플러그인 (플러그인)이 플러그인 인터페이스를 지원하는지 확인합니다. 그렇다면 인스턴스를 만들고, 그렇지 않으면 다음 파일로 이동합니다.
하나의 코드베이스 (appA_1 및 appA_2)에서 두 가지 버전의 소프트웨어를 빌드합니다.
플러그인을로드하면 플러그인 파일과 동시에 빌드 된 응용 프로그램에서 플러그인을로드 할 때 잘 작동합니다. 그러나 appA_2를 빌드하고 appA_1의 플러그인 폴더를 가리키면 GetTypes()가 호출 될 때 예외가 발생합니다.
코드의 기본 버전은 다음과 같습니다.
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
"ReflectionTypeLoadException"예외가 발생합니다.
이것은 응용 프로그램이 모든 사람이 작성한 플러그인 유형을로드 할 수 있기를 원하는 경우에 관한 것입니다. 우리가 누락 된 것이 있습니까?
편집 : LoaderExceptions를 통해 반복 한 결과 System.IO.FileNotFoundException 예외를 생성하는 단일 파일 libPublic.dll이 있음을 발견했습니다. 이상하게도이 파일은 응용 프로그램 디렉토리에 있고 플러그인은 프로젝트 파일을 참조합니다.
는 편집 2 : 우리는 다음 찾을 예외 로그에서 "어셈블리 이름 비교는 불일치 결과 : 개정 번호"
예외 메시지는 무엇입니까? 예외에 내부 예외가 있습니까? 그게 무슨 메시지 야? – dtb
MEF와 같은 기존 프레임 워크를 사용하지 않는 이유가 무엇입니까? – dtb
MEF를 사용할 때 여전히 이와 같은 문제를 만들 수 있습니다. MEF는 쓸데없는 작업을 처리하는 데 확실히 유용합니다. –