2012-11-19 21 views
14

Abbiamo una DLL C# (chiamiamola myapp.exe) costruita con .NET 2.0 Framework (VS2005) e abbiamo scoperto che la nostra applicazione non funzionerà su macchine su cui è installato solo .NET 4.0 o versione successiva. Per lasciare che il nostro lavoro di applicazione su .NET 4.0, ho aggiunto le seguenti alcune linee a myapp.exe.config seguendo questo articolo Installing .NET Framework V4.0 and Running .NET 2.0/3.0/3.5/3.5Sp1 ApplicationsConsenti l'applicazione C# creata con .NET 2.0 per l'esecuzione su .NET 4.0/4.5

<startup> 
    <supportedRuntime version="v4.0.30319"/>  
</startup> 

e si sta lavorando.

poi ho visto che questo articolo ha anche citato il seguente (in particolare secondo comma):

Ora, sapevo che non si può semplicemente prendere un 3.5 Service Pack 1 applicazione ed eseguirlo sul V4.0 CLR. È necessario un CLR V2.0 o riconfigurazione con un tag per piegare l'applicazione per l'esecuzione sul CLR V4.0 e tale piegatura potrebbe essere essere qualcosa che non si desidera eseguire.

Ciò che non avevo ancora capito era che l'installazione di .NET 4.0 non installava i bit necessari per un'applicazione 2.0/3.0/3.5/3.5Sp1. Installa solo lo V4.0 CLR e gli assembly V4.0 e non installa ulteriormente l'equivalente di .NET Framework V3.5 Sp1. Quindi, avresti bisogno di installazione (ad esempio) .NET Framework V3.5 Sp1 da soli insieme a .NET 4,0

Dal mio test vorrebbe dire che avrei potuto correre la mia 2.0 applicazione C# su .NET 4.0 con Framework .NET 4.0 (4.0 assembly/libraries) che è in contraddizione con quanto detto dagli articoli.

O mi manca qualcosa qui? Potrebbe essere utile se qualcuno potesse chiarire questo. Microsoft non lo chiarisce affatto.

+0

Installare la versione completa, non il profilo del client. –

+0

non sei sicuro che la versione completa e il profilo del cliente possano fare la differenza qui? – windfly2006

+1

Tutti lo sanno, ma lo snippet precedente deve essere racchiuso in un '' '' -tag per funzionare. – mhvelplund

risposta

5

Dal mio test significherebbe che potrei eseguire l'applicazione 2.0 C# su .NET 4.0 con .NET 4.0 framework (4.0 assembly/libraries) che è in contraddizione con quanto detto dagli articoli.

È possibile eseguire l'applicazione su .NET 4 utilizzando .NET 4 assemblee. C'è sempre la possibilità che ci possa essere un leggero cambiamento nel comportamento di runtime, tuttavia, poiché non si utilizzerà lo stesso runtime e framework utilizzato per lo sviluppo. Sospetto che l'articolo stia cercando di suggerire che non si otterrà lo stesso identico comportamento installando la 4.0, anche se, come hai visto, dovrebbe funzionare.

È probabile che ciò sia corretto, anche se consiglierei di eseguire test approfonditi dell'applicazione se questa sarà un'opzione di distribuzione standard.

+0

.net 4.0 non può essere installato da solo senza versione precedente (3.5 sp1/3.5) – K3rnel31

+0

@ K3rnel31 Può essere - devi solo configurare la tua app per forzare l'uso di CLR 4 ... –

+0

intendo sulla macchina. 4.0 non può essere installato da solo senza versioni precedenti perché .net 4.0/4.5 è solo un aggiornamento per 3.5sp1/sp2 .. – K3rnel31

-3

L'impostazione di web.config su supportedRuntime version = "v4.0.30319"/non sarà sufficiente.

È necessario aprire effettivamente il progetto in Visual Studio, modificare il framework di destinazione (proprietà -> build) in 4.0 - e quindi ridistribuire la soluzione integrata ai client 4.0. Diversi gruppi di sistema sono diversi tra 2.0 e 4.0 (system.web ecc.) - sebbene, come suggerito nella risposta precedente, sia stata fornita la compatibilità all'indietro.

L'unico modo per fornire in modo coerente ai client una versione '4.0 compatibile' effettiva, è di compilarlo contro un runtime 4.0.Ciò comporterà l'aggiornamento di tutte le librerie open source di terze parti alle loro versioni 4.0.

+1

prima non è una web application 2 lo scopo è quello di mantenere l'assembly in .net 2.0 e farlo funzionare su tutte le altre versioni .. – K3rnel31

+1

Sì. Inteso. Tutto ciò vale ancora. Hai ancora bisogno di ricompilare la tua app (winforms o qualsiasi altra cosa tu abbia) contro un runtime 4.0. La modifica dell'app.config non garantisce nulla.Supporre che funzionerà altrimenti è un grosso rischio - MAGGIO - ma molto dipende da quali gruppi di terze parti vengono sfruttati (nHibernate, log4net ecc ...) A meno che non si aggiorni TUTTI quelli alle loro versioni corrette (4.0) e ricompilare contro di loro, sei pronto per il fallimento. Peccato che tu abbia accettato una risposta contraria all'esperienza del mondo reale (funziona solo in casi LIMITATI) ... – user2736158

7

E cito:

"Il .NET Framework 4 è compatibile con le applicazioni che sono state costruite con le versioni di .NET Framework 1.1, 2.0, 3.0 e 3.5 In altre parole, applicazioni e componenti costruiti. con le versioni precedenti di .NET Framework funzionerà su .NET Framework 4. "

Tratto da Version Compatibility in the .NET Framework

Lei ha l'idea giusta con il file App.config, ma il vostro veramente te stesso limitando con quella riga.
Posso suggerire un uso più liberale delle linee supportate?

Ad esempio:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v2.0.50727"/> 
    <!-- 
    <supportedRuntime version="v3.5"/> "The .NET Framework version 3.0 and 3.5 use version 2.0.50727 of the CLR." 
    --> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.1,Profile=Client" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.1" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.2,Profile=Client" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.2" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.3,Profile=Client" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.3" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
</configuration> 

Perché supportedRuntime version="v3.5" commentato fuori? Ricordare che questa configurazione identifica le versioni del Common Language Runtime (CLR) con cui l'applicazione è compatibile. Non esiste una versione 3.0 o 3.5 del CLR. Fare riferimento a .NET Framework Versions and Dependencies

+0

Puoi spiegare perché hai commentato la linea v3.5? – ananda

+1

@ananda Perché, non è necessario. Aggiornato la mia risposta per affrontare questo. –

1

Solo per essere un po 'più conciso. In App.config stai mostrando il supporto per il CLR. Da. Net v2 e su ci sono solo 2 version of the CLR. Quindi quanto segue ti fornirà il supporto di .Net v2 e oltre. Assicurati di includere il file exe.config che è stato creato con il tuo progetto, altrimenti è probabile che tu continui a vedere il popup che chiede di installare .Net.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v2.0.50727"/> 
    <supportedRuntime version="v4.0"/> 
    </startup> 
</configuration> 

Per il supporto per .Net v2 per uso v3.5:

<supportedRuntime version="v2.0.50727"/> 

Per il supporto per .Net v4.0 al 4,6 impiego:

<supportedRuntime version="v4.0"/> 

Maggiori informazioni si possono trovare per Configure an App to Support .NET Framework

+0

Questo non ha funzionato per me. Ho usato questa voce esatta nel mio app.config. L'ho creato con l'obiettivo impostato su NET Framework 2.0 ed eseguendolo su un sistema Win10 con solo NET Framework 4, è stato richiesto di installare "NET Framework 3.5". L'ho creato con l'obiettivo impostato su NET Framework 4.6.1 ed eseguito su un sistema con solo NET Framework 3.5, è stato richiesto "È necessario prima installare una delle seguenti versioni di .NET Framework" e elencato solo v4.0.30319. – IronRod