.NET 프로젝트에서 참조하는 DLL 버전의 불일치 문제

7694 단어 개발하다

최근에 다음과 유사한 문제가 발생했습니다.
 
-- A:

Specific version assembly reference


Apr 23, 2008 07:18 AM|LINK
Good morning to you all!
I'm specifying "Specific version"=false on all my added assembly references but when I try to deploy the solution with an assembly with different version than the referenced I get an exception: "Could not load file or assembly...".
Example:
Project1 with version 1.0.0.0 specified is compiled into Project1.dll
Project2 references Project1.dll with "Copy Local"=true and "Specific version"=false and is compiled into Project2.dll
MyWebApplication references Project2.dll
On deployment of MyWebApplication I replace Project1.dll (which has been copied into the bin-catalog since Project2 references it) with a recompiled Project1.dll withversion 1.1.0.0. This results in the exception mentioned above, telling me that Project1.dll version 1.0.0.0 couldn't be found.
Analyzing Project2.dll with Reflector shows that the version number is included in the reference-string, even though I specified "Specific version"=false. Shouldn't the version number be omitted under this circumstances?
Best regards,
Richard
 
-- B:
 

Re: Specific version assembly reference


Apr 28, 2008 07:32 AM|LINK
 
Hi Richard,
You may have some confusing about the “Specific version” property. “Specific Version” property is only a build-time directive (for Visual Studio). It has no effect on the runtime version resolution of the referenced assembly.
Please check the following link for detailed informaiton.
What you need to know about referenced assemblies in VS2005http://blogs.msdn.com/irenak/archive/2005/12/13/503105.aspx
 
 
-- A:
 

Re: Specific version assembly reference


Apr 28, 2008 09:30 AM|LINK
Ok, the "Specific version"property only comes in play during compilation. I understand.
I probably should explain my real scenario for you; I'm working on a website that uses the same application layers (DLLs) as a winforms application.
The problem is that the website is hosted on a shared location where a recompiled version of MySQL is required (which is provided by the host and rarely the latest version) since the original won't run under Medium Trust.
I work with/develop the two applications, keeping them in sync with changes, and I want to use the latest version of MySQL in the winforms application and the recompiled version on the website. Since the website uses basic functionality from the MySQL reference the risk of having breaking changes between the versions are slim. The winforms application on the other hand uses the MySQL reference extensively and therefore bugfixes from MySQL is essential.
But I don't want to recompile the whole "tree"with different references each time I make a change. I would like to compile the application layers with the latest version from MySQL and replace the copied DLL with the provided DLL on deployment and let the runtime on the website ignore the fact that the version is incorrect (older).
The application is built in many layers, where the lowest level (assemblies) references the MySQL assembly, kind of like this.
WinForm-application                        Website-application
                              Application.dll
                              Datalayer.dll
                              MySQL.Data.dll
I've read that adding the following section in the web.config might help, but will it work when the reference is indirectly references through many layers of references?

         xmlns="urn:schemas-microsoft-com:asm.v1">
            
                 name="MySql.Data" publicKeyToken="C5687FC88969C44D" culture="neutral"/>
                 oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
            
        
    

Thanks!
 
 
 
 
실제 업무에서 버전 전략이 비교적 많이 사용되고 본 절은 이 면접 문제를 분석하여 프로그램 집합의 버전 전략과 설정 방법을 간략하게 소개할 것이다.관련된 지식점 • 버전 정책의 기본 원리 • 프로그램 집합 버전 정책의 설정 분석 문제이것들은 모두 버전 전략을 통해 실현된 것이다.이른바 버전 정책이란 프로그램 집합 버전의 방향을 바꾸는 것이다. 현재 버전을 불러오는 것을 대체할 수 있는 버전으로 바꾸는 것이다.버전 정책은 응용 프로그램 정책 • 발행자 정책 • 컴퓨터 정책 등 세 가지 단계에서 설정할 수 있습니다. 버전 정책은 XML 파일을 통해 설정할 수 있습니다.이제 필자가 따로 소개하겠습니다.1. 응용 프로그램 정책 응용 프로그램 정책은 응용 프로그램 설정 파일에서 설정할 수 있으며 응용 프로그램 설정 파일은 응용 프로그램 디렉터리에 있습니다.에 대하여.EXE 애플리케이션의 구성 파일은 EXE 파일 이름에 추가됩니다.config 접미사 이름 구성, 예를 들어 테스트.exe 프로그램의 설정 파일은test입니다.exe.config.모든 웹 응용 프로그램의 프로필 이름은 웹입니다.config. 버전 정책은 설정 파일의 assemblybinding 노드에 기록됩니다.코드 2-7은 응용 프로그램의 프로필 예입니다. 이 부분에서 관심을 가진 버전 정책 부분만 선택하십시오.코드 2-7 VersionStrategy: Web.Config name = "NET.MST.Second.Compile"publicKeyToken = "60c29e5f0af3e9bb"> newversion= "12.3.0.0"> 코드 2-7이라는 프로필에 NET를 지정합니다.MST.Second.Compile, 60c29e5f0af3e9bb 이 구성 요소의 버전 정책입니다. 이 정책은 0.0.0.0에서 12.2.2.2.2 사이의 모든 버전을 12.3.0.0 버전으로 바꿉니다.2. 발행자 정책 발행자 정책은 전역 프로그램 집합 캐시(GAC)에 넣은 프로그램 집합을 대상으로 발행자 정책은 코드 2-6과 같은 형식의 프로필 형식으로 프로그램 집합에 연결되어 GAC에 함께 넣는다.발행자 정책 설정 파일의 파일 이름은 매우 기괴합니다. 이것은 이러한 문자열입니다. 메인 버전 번호입니다.보조 버전 번호.프로그램 집합 이름.dll.따라서 프로그램 집합의 주 버전/차 버전 번호는 발행자 정책이 하나밖에 없습니다.3. 컴퓨터 정책과 마찬가지로 컴퓨터 정책은 하나의 설정 파일로 표시되고 그의 형식도 코드 2-7과 기본적으로 유사하다.컴퓨터급 버전 정책 설정 파일의 파일 이름은:machine.config, 이것은% SystemRoot%\Microsoft에 저장됩니다.NET\Framework\v****\CONFIG\디렉토리에 있습니다.여기까지 읽으면 독자들은 다음과 같은 의문을 가질 수 있다. 버전 전략은 세 가지 단계에서 설정할 수 있는데 이런 전략들은 어떻게 협동하는가?대로NET의 메커니즘은 3가지 단계의 버전 정책이 순서대로 실행되고, 이전 단계의 실행 결과는 다음 단계의 실행 입력으로 입력됩니다.응용 프로그램, 발행자, 컴퓨터의 순서에 따라 3가지 버전 정책이 실행됩니다.그 중에서 발행자 정책은 선택할 수 있으며 다음 두 가지 상황에서 발행자 정책은 실행되지 않을 것이다.• 프로그램 집합이 GAC에 포함되지 않았습니다. 프로그램 정책 제정 발행자 무시 정책은 첫 번째 상황에서 발행자 정책 설정 파일이 존재하지 않습니다. 물론 CLR도 발행자 정책을 실행하지 않습니다.두 번째 상황은 프로그래머가 응용 프로그램 정책에서 발행자 무시 정책을 지정하는 것이다. 구체적인 방법은 응용 프로그램 설정 파일에publisherPolicy 노드를 추가하고 apply 속성 값을 no로 설정하는 것이다.코드 2-8은 코드 2-7을 토대로 발행자 무시 정책을 지정했다.코드 2-8 VersionStrategy-NoPolisherPolicy: Web.Config                        name="NET.MST.Second.Compile"  publicKeyToken="60c29e5f0af3e9bb">               newversion="12.3.0.0">                     
정답 CLR은 응용 프로그램 정책, 발행자 정책, 컴퓨터 정책 등 세 가지 단계에서 버전 정책을 설정할 수 있습니다.모든 정책의 설정은 프로필을 수정해서 이루어집니다.3단계 정책은 CLR 순으로 실행되고 이전 정책의 실행 결과는 다음 정책으로 입력됩니다.발행자 정책은 GAC에 넣은 프로그램 집합에만 적용되며, 프로그램 정책에서 무시될 수 있습니다.

좋은 웹페이지 즐겨찾기