특정 위치에 놓인 "플러그인"으로 구현할 수있는 몇 가지 미리 정의 된 인터페이스를 제공하여 기존 앱에 일부 확장 성을 추가 할 것을 고려하고 있습니다. 플러그인의 업데이트와 배포가 빈번히 이루어지는 동안 애플리케이션의 핵심은 거의 업데이트되지 않습니다.어셈블리 및 버전 관리
// in core assembly (core.dll)
public interface IReportProvider{
string GenerateReport();
}
// in other assembly(plugin.dll)
public class AwesomeReport : IReportProvider {
string GenerateReport(){ ... }
}
두 프로젝트가 같은 빌드 프로세스의 일부이며, 핵심 응용 프로그램이 자체에 배포됩니다 및 플러그인은 이후 단계에서의 삭제됩니다 :이 같은 설정을 가진 그러니까 기본적으로
.제 문제는 어셈블리 버전 관리와 시간 경과에 따른 해결입니다. core.dll v1이 배포되었고 플러그인에 드롭한다고 가정 해 봅시다. 이것은 plugin.dll이 core.dll v1을 참조하는 경우 훌륭하게 작동합니다. 그러나 plugin.dll이 core.dll의 최신 버전 (빌드의 일부로 v2라고 함)에 대해 컴파일 된 경우 core.dll v2를 참조하기 때문에 플러그인이로드되지 않지만 배포 된 버전에는 core.dll 만 있습니다. v1.
이것은 합리적이고 예상되는 동작이지만이 프로젝트가 설정되는 방식에 두 가지 문제점이 있습니다. 즉, 빌드를 다시 실행하고 새 플러그인을 삭제하여 플러그인의 개발/업데이트를 수행 할 수 없습니다 (이제는 최신 버전 종속성이 있음).
(예전 어셈블리에 새로운 어셈블리를 해석 할 때 발생할 수있는 잠재적 문제와 형식 정의의 잠재적 불일치에 대해 알고 있습니다. 문제는 유형 정의가 일치하지 않는 문제를 해결하는 것이 아니라 고급 어셈블리 해결 문제를 해결하는 데 있습니다.
- 하는 추가 바인딩 리디렉션, Web.config의 모든 core.dll 지시 :. 내가 정말 좋아하는 것처럼)
나는 간단하다 어느 것도 작동 물건을 얻기위한 몇 가지 옵션을 참조 core.dll v1 참조로 해결할 v1 + 참조
- 인터페이스 정의가 포함 된 'contracts.dll'어셈블리 만들기 및이 특정 어셈블리의 버전 번호를 빌드간에 변경하지 않음
- 배포 된 버전의 core.dll에 대한 플러그인 작성 (어떤 방식 으로든 개발 된 버전을 참조)
언급했듯이, 이들 중 아무 것도 나를 위해 정말로 낮은 교수형 과일이 아니며 누군가가 더 나은 해결책을 갖고 있기를 바라고 있습니까?
버전 할 마법 솔루션 및 DLL 지옥의이 종류가 없습니다. CLR은 이미 탁월한 보호 기능을 가지고 있으며,이를 피하는 것이 마지막으로 고려해야 할 사항입니다. 대신 단단한 배포 시나리오에 집중하십시오. –
"Contracts.dll"이 단순하지 않은 이유는 무엇입니까? 나는 이것이 좋은 해결책이라고 생각한다. 계약 라이브러리는 절대로 변경되지 않고 core.dll과 plugin.dll은이를 통신용 "미들웨어"로 사용합니다. –