2012-02-15 6 views
3

Oracle ODP.NET을 사용하는 매우 큰 프로젝트가 있습니다. 현재 버전 10.1.0.401 (이 시점에서 상당히 오래된 버전 임)과 비교하여 구축 중입니다. 이것은 내 컴퓨터와 빌드 머신에서 작동합니다. 빌드 컴퓨터에는 Visual Studio가 설치되어 있지 않지만 솔루션 파일에 대해 MSBuild가 직접 사용됩니다.SpecificVersion false로 인해 컴파일 오류가 발생합니다.

개발자 컴퓨터에 ODP의 새로운 버전을 설치하려고합니다. 그러나 다른 개발자 나 빌드 머신에 영향을 미치고 싶지 않습니다. 사람들이 다른 시간에 버전을 업그레이드 할 수있게하고 싶습니다. 웹 서버가 업그레이드 될 때까지는 빌드 머신을 업그레이드 할 수 없습니다 (기업 환경 - 몇 달이 걸릴 것입니다).

는 현재, 소스 제어에서 *의 .csproj 파일에 Oracle.DataAccess 참조는 다음과 같습니다

<Reference Include="Oracle.DataAccess, Version=10.1.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 

그래서 SpecificVersion가 true로 설정되고, 10.1.0.401는에 GAC에 기계를 만드십시오. 이것은 잘 지어진다. 그래서 나는 단지 SpecificVersion에 대한 참조를 false로 변경하고 커밋하는 것으로 파악합니다. 내 컴퓨터에서 참조가 새 버전으로 해결되며 빌드 컴퓨터에서 10.1.0.401로 계속 확인됩니다.

<Reference Include="Oracle.DataAccess, Version=10.1.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342"> 
    <SpecificVersion>False</SpecificVersion> 
</Reference> 

은 어떻게 든,이 컴파일 장애를 가지고 빌드 서버에서 MSBuild를 실행 원인 : 그래서 나는이처럼 보이는 파일에 대한 변경 사항을 커밋합니다. 오류 :

"C:\path\to\MySolution.sln" (Rebuild target) (1) -> 
"C:\path\to\my\project.csproj" (Rebuild target) (2) -> 
    (CoreCompile target) -> 
    My\ClassFile.cs(241,67): error CS1061: 'Oracle.DataAccess.Client.OracleConnection' does not contain a definition for 'EnlistDistributedTransaction' and no extension method 'EnlistDistributedTransaction' accepting a first argument of type 'Oracle.DataAccess.Client.OracleConnection' could be found (are you missing a using directive or an assembly reference?) [C:\path\to\my\project.csproj] 

전혀 Oracle.DataAccess를 찾을 수 있다면 그것은 나에게 이해,하지만 어떻게 누락 된 API에 대해 컴파일 오류는 무엇입니까? 이 API는 ODP 10.1.0.401에 존재하므로 내가 알 수있는 정당한 오류는 아닙니다.

업데이트 :
이것은 GAC에있는 DLL과 관련이 있습니다. DLL을 로컬로 가지고 있고 로컬 파일에 대한 HintPath를 포함하도록 참조를 변경하면 문제가 정상적으로 컴파일됩니다. SpecificVersion = False와 GACed 어셈블리를 결합하는 것이 적절하지 않습니까?

+2

msbuild가 GAC에서 찾기 전에 다른 버전의 DLL을 찾는 것처럼 들립니다.SpecificVersion은 false이므로 찾은 첫 번째 버전을 사용합니다./v : d를 사용하여 서버에서 msbuild를 실행하고 msbuild ResolveAssemblyReference 작업의 출력을 봅니다. [이 답변] (http://stackoverflow.com/a/1772464/293522)을 참조하십시오. –

답변

3

이 어셈블리도 사용하고 있습니다. 이 어셈블리는 프로젝트 디렉토리 트리의 "Assemblies"폴더에서 특정 버전 = false로 참조하고 있습니다.

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86"> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\..\..\Assemblies\Llblgen\Oracle.DataAccess.dll</HintPath> 
</Reference> 

모든 팀원이 동일한 버전의 컴퓨터에 설치되어 있기 때문에 작동합니다. 빌드 서버에는 다른 상황이있었습니다. 왜 그런지 기억하지 않지만 어셈블리 바인딩 리디렉션을 machine.config에 추가해야합니다. 오라클의 assemby는 64 비트 빌드 서버에서 작동하는 빌드를 얻습니다.

두 개의 Oracle.DataAccess 어셈블리가 GAC에 설치된 새로운 ODP.NET이 원인 일 수 있습니다. 하나는 버전 4.xx의 .NET 4.0 용이고 2.111.xx는 2 번째입니다. MSBuild 4.0 (TFS2010)을 사용하여 소스를 컴파일했고 (우리 프로젝트는 .NET3.5를 대상으로 함) 항상 GAC에서 2.xx 버전 대신 4.xx 버전을로드하려고했습니다.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral" /> 
     <bindingRedirect oldVersion="2.102.0.0-2.120.0.0" newVersion="2.112.2.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

미안 해요, 난 빌드 서버에 정확히 내 오라클 문제를 기억하지 않지만,이 어셈블리 리디렉션이 도움이되었다 :

나는이 Machine.config 파일 중 하나의 업데이트하여 그것을 해결.

+0

비슷한 결과로 바뀌 었습니다. Oracle.DataAccess.dll의 로컬 사본을 작성하고 GAC 대신에 참조하십시오. 더 잘 작동하는 것 같습니다. – RationalGeek

관련 문제