2012-02-28 12 views
5

Ho un assembly .NET 3.5 che fa riferimento a ODP (Oracle.DataAccess.dll), in Visual Studio 2010. Copia Local = False, la versione specifica è falsa. Il percorso èRiferimento ODP Oracle.DataAccess.DLL 32/64 bit

C:\[ORACLE_BASE]\product\11.2.0\client_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll 

La versione è 2.112.3.0, (Runtime v.2.0.50727). Ho installato ODAC 11.2.0.3.0 x86 sul mio computer di sviluppo. Quando costruisco questo progetto e lo collaudo in un test di integrazione, tutto funziona correttamente e ODP viene caricato e utilizzato. Sto provando a costruire lo stesso test di integrazione su Team City 7, su un computer Windows Server 2003 x64, utilizzando MSBuild (tramite Team City). Questa macchina ha la stessa versione di ODAC installata, ma la versione x64.

C'è un problema nel tentativo di caricare Oracle.DataAccess.dll. Sembra che stia cercando la versione .NET 2, ma prima trova la versione .NET 4. e quindi inevitabilmente fallisce. Guardando i log, trova la versione .NET 4., ma non è ancora in grado di risolvere il riferimento e sembra cercare esplicitamente la versione x86. La configurazione per MSBuild è: Versione MSBUILD: .NET 4.0 Esegui piattaforma x86.

riferimento CSProject:

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

(Ho provato a cambiare la piattaforma Esegui per x86, e sembra accettare la biblioteca Oracle.DataAccess.dll, ma si lamenta che tutti gli altri librerie di base .NET stanno prendendo di mira il male . della piattaforma, ad esempio, mscorlib

sto anche cercando di fare una build tramite uno script rastrello che utilizza MSBuild per creare la soluzione di progetto, e ottenere problemi simili

Domande: Come posso ottenere questo per costruire correttamente sulla mia macchina x64? Le versioni x86 e x64 delle librerie hanno lo stesso PublicKeyToken, quindi non dovrebbe funzionare? Un tag di riferimento in un CSProj può essere impostato come target "Qualsiasi CPU" anziché esplicitamente x64 (modificando manualmente il file)? Oppure, c'è un modo per impostare un modo per fare riferimento condizionatamente ad una libreria a seconda dell'architettura della macchina di costruzione, come mostrato here (non esattamente sicuro di quale sia il problema, ma questa potrebbe essere una soluzione)?

[14:30:09]PrepareForBuild: 
[14:30:09] Creating directory "bin\Debug\". 
[14:30:09]ResolveAssemblyReferences: 
[14:30:09] Unified primary reference "Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86". 
[14:30:09]  Using this version instead of original version "2.112.3.0" in "D:\TeamCity\buildAgent\work\f2ad3a714cc001ba\Source\MyProj\MyProj.Data.Oracle\bin\Debug\MyProj.Data.Oracle.dll" because AutoUnify is 'true'. 
[14:30:09]C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3245: Could not resolve this reference. Could not locate the assembly "Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. [D:\TeamCity\buildAgent\work\f2ad3a714cc001ba\Source\MyProj\MyProj.IntegrationTests\MyProj.IntegrationTests.csproj] 
[14:30:09]   For SearchPath "D:\TeamCity\buildAgent\work\f2ad3a714cc001ba\Source\MyProj\MyProj.Data.Oracle\bin\Debug". 
[14:30:09]   Considered "D:\TeamCity\buildAgent\work\f2ad3a714cc001ba\Source\MyProj\MyProj.Data.Oracle\bin\Debug\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "D:\TeamCity\buildAgent\work\f2ad3a714cc001ba\Source\MyProj\MyProj.Data.Oracle\bin\Debug\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   For SearchPath "{TargetFrameworkDirectory}". 
[14:30:09]   Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   For SearchPath "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}". 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Itanium\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Itanium\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\VSTA\v9.0\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\VSTA\v9.0\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\PublicAssemblies\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\PublicAssemblies\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "D:\ODAC_Base\product\11.2.0\client_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll", but its name "Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" didn't match. 
[14:30:09]   Considered "D:\ODAC_Base\product\11.2.0\client_1\ODP.NET\bin\2.x\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft Chart Controls\Assemblies\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft Chart Controls\Assemblies\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "D:\ODAC_Base\product\11.2.0\client_1\ASP.NET\bin\2.x\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "D:\ODAC_Base\product\11.2.0\client_1\ASP.NET\bin\2.x\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   For SearchPath "{AssemblyFolders}". 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft.NET\ADOMD.NET\100\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft.NET\ADOMD.NET\100\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\PipelineComponents\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\PipelineComponents\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\ForEachEnumerators\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\ForEachEnumerators\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]   For SearchPath "{GAC}". 
[14:30:09]   Considered "Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86", which was not found in the GAC. 
[14:30:09]   For SearchPath "bin\Debug\". 
[14:30:09]   Considered "bin\Debug\Oracle.DataAccess.dll", but it didn't exist. 
[14:30:09]   Considered "bin\Debug\Oracle.DataAccess.exe", but it didn't exist. 
[14:30:09]GenerateTargetFrameworkMonikerAttribute: 

risposta

5

Ho avuto lo stesso problema. Il problema era nella versione di MsBuild sul server. Ho usato Msbuild 4.0 e utilizza runtime v4.0 invece di 2.0.xx utilizzato in MsBuild 3.5.

Provare a utilizzare Msbuild 3.5 se possibile. In caso contrario, controlla il tuo GAC se ODP è stato installato correttamente. Non ricordo esattamente come ho risolto per MSBuild 4.0, ma ho dovuto giocare con gli assembly GAC e machine.config.

Questo è il mio elenco GAC per Oracle.DataAccess.dll sul nostro server a 64 bit di costruzione: Oracle.DataAccess.dll in my GAC

Questa è la parte di machine.config. Ho dovuto aggiungere il montaggio di reindirizzamento:

<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> 
     <dependentAssembly> 
    </assemblyBinding> 
</runtime> 

ho aggiornato tutti i machine.configs per essere sicuri :) Ma l'aggiornamento Framework64 machine.config dovrebbe essere sufficiente.

+0

Sulla mia macchina di compilazione, ho solo la versione 2.112.3.0 e 4.112.3.0 di AMD64. x64 non è elencato lì. Vuoi dire app.config not machine.config, o deve essere fatto sulla configurazione della macchina? Ho impostato il mio CSPRoj per non cercare la versione specifica, quindi non dovrebbe coprire le modifiche di machine.config? –

+0

Per i bulbi di teamcity che utilizzano MSBUild (non lo script rake), impostandolo su .NET 3.5 per MSBuild non riesce a generare altri assembly, indicando che non riesce a trovare LINQ. Questo mi confonde dal momento che LINQ è in .NET 3.5 –

+0

Sembra che tu abbia installato ODAC 32 bit e 64 bit? Inoltre, nel mio primo commento, intendevo dire che "x86 non è elencato lì" nella mia seconda frase. Non è possibile modificarlo ora. –