2009-11-12 4 views
0

두 가지 버전의 dll로 작업해야하는 응용 프로그램이 있습니다. 한 번만 응용 프로그램을 컴파일하고 exe를 두 개의 디렉토리에 복사 한 다음 dll의 두 버전을 각 디렉토리에 복사한다고 생각했습니다. 참고로, 저는 GAC에 대해 아무 것도하지 않습니다. 그러나 컴파일되지 않은 dll이있는 버전에서는 FileLoadException이 발생합니다.FileLoadException dll의 새 버전으로

프로젝트에서 dll 참조에 대해 "특정 버전"을 false로 설정했습니다. 그러나 어쩌면 그것은 잘못된 설정입니다. 여러 버전에서 어떻게 작동합니까?

답변

0

내가해야 할 일이 있기 때문에 내가 설정 파일을 변경하는 것을 막았습니다. dll의 다른 버전에 대한 주소 변경에 관해서는, 실제로 내 메서드를 호출하는 인터페이스를 사용하고 있기 때문에 나는 그 문제가 있다고 생각하지 않습니다.

좀 더 자세하게 설명하기 위해 여러 dll에서 한 가지 유형의 인스턴스 만 만들면됩니다. 거기서 인터페이스 객체로 취급합니다. 그래서, 내 해결책은 다음과 같습니다.

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll"); 
Type type = asm.GetType("MyType"); 
IMyType obj = Activator.CreateInstance(type) as IMyType; 

이것은 작동하는 것 같습니다.

2

참조하는 어셈블리가 강력하게 서명 된 경우 컴파일 된 버전과 다른 버전이 있으면 CLR이 해당 서명을로드하지 않습니다. 물론

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="YouAssemblyNameWithoutDotDll" 
           publicKeyToken="your-assembly-token" 
           culture="neutral" /> 
      <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

이 어셈블리의 새 버전이 같은 방법으로 서명이 있다고 가정 또는 당신이 MissingMethodException 런타임에 얻을 것이다 :이 경우에 사용하는 버전을 지정하는 설정 파일을 당신이 원하는 사용할 수 있습니다 .

0

dll을 다시 컴파일 할 때마다 함수의 주소가 변경되기 때문입니다. 그리고 당신이 dll로 컴파일 시간에 앱을 바인딩하고 있기 때문에, 그 주소는 앱에서 수정되도록 설정됩니다. 기본적으로 dll의 새 버전으로 프로그램을 다시 컴파일해야합니다 (또는 더 정확하게, 데이터 구조가 엉망인 경우). 동적로드 및 GetProcAddress를 사용하십시오.

0

두 버전의 어셈블리가 AssemblyInfo.cs 파일에 지정된 것과 동일한 AssemblyVersion을 갖고 있는지 확인하십시오.

예 :

[assembly: AssemblyVersion("1.0.0.0")] 

나는 VS 2008 전에 새로운 프로젝트를 생성하는 기본은 생각 : 자동으로 빌드 할 때마다 어셈블리 버전을 증가합니다

[assembly: AssemblyVersion("1.0.0.*")] 

.

어셈블리의 강력한 이름에 해당 버전이 포함되어 있으므로이 값은 assemblies that are signed에 특히 중요합니다.

관련 문제