2014-11-12 3 views
0

자동 업데이트 시나리오의 경우 앱에서 자동으로 업데이트 된 dll을 클라우드에서 내리고 싶습니다. 내 VS 프로젝트에서 어셈블리 (v1.0.0.0) 참조했습니다. 내가 좋아하는 것 수동으로로드 된 어셈블리의 새 인스턴스

var class1 = new Class1(); 

유형의 예를를 얻을 : 나는 그것을 새로운 때 있도록 나는, 런타임에의 (예 : v1.1.0.0에 대한) 최신 버전을로드하고 싶습니다 (Class1) 어셈블리 버전 v1.1.0.0. 이것은 가능한가?

참고 : 리플렉션을 사용하여 Class1 유형의 인스턴스를 만들지는 않겠지 만 새롭게 구성했습니다.

+1

귀하의 질문은 매우 명확하지 않다. – gdoron

+0

버전 바인딩을 리디렉션하도록 응용 프로그램 구성을 설정할 수 있습니다. –

+0

문구를 – Pompair

답변

2

바인딩 어셈블리 인 경우 응용 프로그램에 대한 최신 (그러나 여전히 호환되는) 어셈블리를로드하도록 로더에 알리기 위해서는 assembly redirection을 사용해야합니다. 이는 응용 유형에 따라 app.config 또는 web.config에서 수행하는 작업입니다. (예를 들어 위의 링크에서 촬영)

<dependentAssembly> 
    <assemblyIdentity name="someAssembly" publicKeyToken="32ab4ba45e0a69a1" 
     culture="en-us" /> 
    <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" /> 
</dependentAssembly> 

oldVersion는 버전 범위 가능하므로 다중 이전 버전의 어셈블리는 단일의 새로운 버전에 맵핑 될 수있다. 또한 복수 bindingRedirect 항목이있을 수 있습니다.

편집 : 동적 어셈블리에서 형식을로드하려면

, 당신은 형식 자체를 (즉,이은을 묶어 때문에 당신은 Class1 obj = ...; 같은 것을 (var obj = ...이 동일) 가질 수있다 참조 할 수 없습니다 어셈블리 리디렉션이 작동하지만 올바른 버전을 모르는 경우에는 사용할 수 없습니다.

또 다른 옵션은 기본 응용 프로그램에 인터페이스를 정의한 다음 다양한 어셈블리가 이러한 인터페이스를 구현하므로 형식을 동적으로로드하고이를 캐스팅 할 수 있습니다. o 알려진 인터페이스 유형. 이를 위해 의존성 삽입 (LightInject 등)을 사용하거나 어셈블리에 특정 인터페이스 구현이 들어있는 구성 파일을 지정할 수 있습니다. 이 assemblyname로드 할 수있는 알려진 어셈블리에 참조하는 가정 typename 것을 해당 어셈블리에하고 IInterface를 구현

IInterface obj = (IInterface) Activator.CreateInstance ("assemblyname", 
    "typename").Unwrap(); 

: 마지막에 당신이 뭔가를 할 것입니다.

인터페이스를 사용하면 컴파일 타임에 하드 코딩 된 유형 만 인터페이스로 사용되며 해당 구현이 올바른 인터페이스를 구현하는 한 모든 어셈블리에서 모든 구현을로드 할 수 있습니다. 이렇게하면 다양한 구성 요소를 쉽게 교체 할 수 있습니다.

DI 라이브러리를 사용하면 많은 라이브러리가 어셈블리에서 인터페이스를 구현하는 유형을 발견 한 다음 사용자가 요청할 때 새 인스턴스를 제공합니다.

당신은 또한 몇 가지 추가 정보에 대한 비슷한 질문이 대답 볼 수 있습니다 : https://stackoverflow.com/a/26809961/682404

+0

이것은 내가 dll의 향후 버전 번호를 미리 알아야하고 클라이언트 설정 파일에 대한 액세스 권한이 있어야한다는 의미이므로 사용할 수 없습니다. 이 쓸모 없어. 앱이 사용자 필드에 있으며 서버를 통해 패치 dll을 제공하려고합니다. 앱은 앱 시작시 등에서 업데이트를 확인합니다. 이는 쉬운 부분이지만 앱에서 참조 된 dll을 바꾸는 방법은 무엇입니까? – Pompair

+0

@Pompair 답변에 대한 세부 정보를 추가했습니다. – xxbbcc

+0

+1. @Pompair, 당신은 미래의 버전 번호를 알 필요가 없습니다. 리다이렉트 명령문이 v999.999.999와 같은 미친 높은 번호로 이동하는지 확인하십시오. 그 시점에서 잘 작동해야합니다. – code4life

관련 문제