2014-03-19 4 views
1

우리는 순차적으로 데이터베이스 업데이트를 실행해야합니다. 각 데이터베이스 업데이트는 자신의 DLL을, 그리고 우리의 도메인 DLL의 특정 버전에 대한 종속성 (업데이트가 쓰여진시 현재)를 유지하기 위해 필요합니다. 예를 들어 :동일한 어셈블리의 다른 버전을 참조하는 DLL을 동적으로로드하는 방법은 무엇입니까?

Cool.Program.Update0001.dll is dependent on Cool.Program.Domain.dll version 1.0.1 
Cool.Program.Update0002.dll is dependent on Cool.Program.Domain.dll version 1.0.3 
Cool.Program.Update0003.dll is dependent on Cool.Program.Domain.dll version 1.1.6 

내 계획은 다음과 같이 이러한 DLL을 하위 폴더에 & 그들의 종속 DLL을 저장하는 것입니다 :

%APP%\Cool\Program\Updates\0001\Cool.Program.Update0001.dll 
%APP%\Cool\Program\Updates\0001\Cool.Program.Domain.dll (version 1.0.1) 

%APP%\Cool\Program\Updates\0002\Cool.Program.Update0002.dll 
%APP%\Cool\Program\Updates\0002\Cool.Program.Domain.dll (version 1.0.3) 

%APP%\Cool\Program\Updates\0003\Cool.Program.Update0003.dll 
%APP%\Cool\Program\Updates\0003\Cool.Program.Domain.dll (version 1.1.6) 

동적으로 순서대로 내 주요 프로그램로드 & 호출 각 업데이트 DLL을 가지고, 반향 사용 :

불행히도이 디자인을 테스트하고 버전 번호를 조사한 결과, 각 업데이트 이전 폴더가 자체 하위 폴더에 저장되어 있더라도 XXXX.dll은 최신 Domain.dll과 함께 작동합니다. GAC를 통해 의존성을 해결하거나 주 프로그램에 이미로드 된 종속성을 기본값으로 설정한다고 가정합니다. (BTW 나는 프로젝트 참조 및 빠른 구글 - Fu는이이 간단하지 않습니다 제안에 대해 "특정 버전"을 강제 할 수 없습니다 Visual Studio에서 참조하십시오.)

내 질문 :

어떻게 업데이트 어셈블리가 도메인 dll에 대한 로컬 폴더의 종속성을 해결하도록합니다.

또는 :

내가 명시 적으로 동적으로로드 된 어셈블리에 대한 종속성을 주입 할 수 있습니까?

편집 : 나는 대답을 발견했습니다 아래를 참조하십시오.

답변

0

나는 평균 시간에 그것을 완료 한 나는 내 자신의 질문에 답변 해 드리겠습니다. MarshalByRefObject에서

그것은 클래스를 사용하고 있다고 가정
// versionNumber = "0001", "0002" etc 

var basePath = Path.GetDirectoryName(typeof(this).Assembly.Location) + "\\Updates\\" + versionNumber + "\\"; 
var updateAssemblyPath = Path.Combine(basePath, "Cool.Program.Update" + versionNumber + ".dll"); 

var setup = AppDomain.CurrentDomain.SetupInformation; 
setup.ApplicationBase = basePath; 
var newDomain = AppDomain.CreateDomain("Updater for " + versionNumber, null, setup); 

var obj = (ICanDoSomething)newDomain.CreateInstanceFromAndUnwrap(updateAssemblyPath, "TestDynamicAssemblyLoading.Update"+ versionNumber + ".Class1"); 
var result = obj.TellMeYourVersionsAndDependencyVersions(); 
MessageBox.Show(result); 

알려진 인터페이스를 구현 (예 : "ICanDoSomething을".) 및 상속 :

이 코드는 트릭을 수행

public class Class1 : MarshalByRefObject, ICanDoSomething 
{ 
    public string TellMeYourVersionsAndDependencyVersions() 
    { 
     return 
      typeof(Class1).Assembly.GetName().Version + "\n\n" + 
      "My reference to Domain\n=================\n " + SomeModel.TellMeYourVersionsAndDependencyVersions() + "\n\n" + 
      "My reference to Common\n=================\n " + SomeUtility.TellMeYourVersion(); 
    } 
} 
관련 문제