Ho un semplice programma da riga di comando, scritto in C#, in esecuzione su .NET 4.0 e compilato con Visual Studio 10.0.Perché un EXE .NET, compilato come x86, viene eseguito come x64?
Quello che fa è estrarre i dati dal file Access.mdb di un altro fornitore e inserirli in un database Sql Server, in modo che una delle nostre app possa accedere ai dati.
Utilizziamo le classi OleDbConnection/OleDbCommand/OleDbDataReader di .NET, utilizzando Microsoft.Jet.OLEDB.4.0 come provider di dati.
Questo ha funzionato bene, per noi, fino a quando non abbiamo provato a eseguire su macchine a 64 bit. Risulta che non esiste un provider OleDb a 64 bit per .NET. Ci sono discussioni vaghe e semitrasparenti sul problema sparse per tutto il web, con discussioni su diverse versioni di Access, o MDAC, o Office, o qualsiasi altra cosa, che in qualche modo ha reso le cose funzionanti per alcune persone.
Quello che abbiamo fatto è stato configurare il progetto su target x86. E il problema è andato via.
Ora è tornato, per ragioni che semplicemente non capisco. Quando costruisco il programma sul mio computer locale, viene eseguito come x86, ma quando lo compilo sul nostro computer di costruzione, viene eseguito come x64.
Il file di progetto è chiaramente configurato per x86:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
E 'costruito dalla stessa batchfile, sia sulla mia macchina o sul sistema di compilazione:
msbuild OurApp.sln /property:Configuration=Release
E i exes generati dite sono x86, indipendentemente dal computer su cui sono costruiti. Se corro dumpbin/intestazioni su entrambi, vedo:
FILE HEADER VALUES
14C machine (x86)
3 number of sections
4FBA64C8 time date stamp Mon May 21 10:52:40 2012
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
L'unica differenza tra le discariche di un exe costruita sulla mia macchina e un exe costruita sul sistema di compilazione è il timestamp e il percorso del file .pdb.
Ma, ed ecco la cosa strana, un exe costruito sulla mia macchina funziona bene, uno costruito sugli errori della macchina di compilazione con lo stesso messaggio di errore che avevamo visto quando lo avevamo creato come x64.
Più di questo - il nostro programma ottiene la sua configurazione dal registro e, per comodità dell'utente, se non trova un'impostazione, ne crea uno. Li leggiamo e li creiamo in, HLM \ SOFTWARE \ OurName \ OurApp. Ma, naturalmente, dal momento che questa è un'app a 32 bit in esecuzione su una macchina a 64 bit, dovrebbe davvero essere la lettura e la scrittura da HLM \ SOFTWARE \ WoW6432Node \ OurName \ OurApp.
E con le app create sulla mia macchina, lo fa. Ma le app che sono costruite sulla macchina di compilazione, nonostante siano compilate per x86 e con intestazioni che indicano che dovrebbero essere eseguite come x86, leggere e scrivere da HLM \ SOFTWARE \ OurName \ OurApp e non da HLM \ SOFTWARE \ WOW6432Node \ OurName \ OurApp. Come se fosse effettivamente in esecuzione come un'app 64-bit, nonostante tutto.
Qualcuno ha idea di come questo potrebbe accadere?
I file di configurazione sono identici? – Oded
Vedere la prima risposta su http://stackoverflow.com/questions/8794379 per una possibile soluzione. Inoltre, ho notato che stavi creando la configurazione di 'AnyCPU' che è distinta da' x64' e 'x86' e potrebbe introdurre il comportamento – skarmats
Nessun file di configurazione. Costruire direttamente dal controllo di versione. –