APPCRASH Framework 4.0

martedì 21 aprile 2015 - 17.22
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010

mmjc23 Profilo | Newbie

Buongiorno a tutti
Di nuovo uno di quei problemi incomprensibii

Ho un applicativo sviluppato in VB.Net che, per comunicare con un determinato dispositivo, esegue delle chiamate API alla relativa DLL.
L'applicativo, viene compilato in "x86" e viene eseguito sia su macchine x86 che x64.
La chiamata alla funzione API ha sempre funzionato correttamente...compilata con VS2005 e Framework2.0 oppure con VS2010 e Framework 3.0.
Adesso, quando cerco di compilarla con VS2010 e Framework 4.0, funziona correttamente se utilizzo il "Debug" di visualstudio mentre se eseguo il file ".exe" (Debug o Release non cambia) compilato dallo stesso Visual Studio, la funzione mi genera un errore.

Ho provato anche a modificare la chiamata alla DLL da "Declare Function" a "DllImport" impostando "CallingConvention:=CallingConvention.Cdecl" ma il problema non si risolve. (La CallingConvention è corretta a "Cdecl" in quanto tutte le altre chiamate API funzionano)
L'errore generato è il seguente:
Nome evento problema: APPCRASH
Nome applicazione: xxxxx.exe
Versione applicazione: 4.0.0.0
Timestamp applicazione: 55361b6e
Nome modulo con errori: ntdll.dll
Versione modulo con errori: 6.3.9600.17031
Timestamp modulo con errori: 5308893d
Codice eccezione: c0000005
Offset eccezione: 00041619
Versione SO: 6.3.9600.2.0.0.256.48
ID impostazioni locali: 1040
Informazioni aggiuntive 1: 5861
Ulteriori informazioni 2: 5861822e1919d7c014bbb064c64908b2
Ulteriori informazioni 3: bb02
Ulteriori informazioni 4: bb02c3b29c3f075104f1d0629e885cfc

Ho provato ad eseguire l'exe compilato con il framework 3.0 sulla stessa macchina e funziona correttamente...non sembra nè un problema di computer (lo fa anche su altri) nè di sistema operativo.
Qualcuno ha qualche idea di come risolvere o debuggare il problema?
Grazie mille

ratum99 Profilo | Junior Member

Buongiorno,

anche io ho avuto un problema simile passando la mia app da Framework 3.5 a 4.0.

Io ho risolto mettendo nel file app.config del progetto principale di avvio la seguente dicitura:

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

dentro il tag <configuration> </configuration>

in particole ho dovuto aggiungere a mano "useLegacyV2RuntimeActivationPolicy="true"".

Nella distribuzione del programma inserisco anche i vari fiele *.config

e tutto funziona.

La del motivo perchè funzioni è un po' complessa.

Prova vedere se anche per te è questo il caso.



-RA-
"Programmare? non è così difficile"

mmjc23 Profilo | Newbie

Ciao Ratum99 e (soprattutto) grazie mille per la risposta ed il tempo dedicatomi

Ho provato ad aggiungere (a mano...come nel tuo caso), il testo "<startup useLegacyV2RuntimeActivationPolicy="true">" al file app.config che, quindi, si presenta in definitiva così:
<startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Ho provato anche a copiare il file app.config nella directory di esecuzione del programma, anche se ho notato che, quando si compila l'applicativo, viene già creato un file nomeapplicativo.exe.config contenente le nuove modifiche, ma il risultato non cambia...funziona tutto correttamente se debuggo mediante VisualStudio, ma va in crash (nonostante il Try-Catch) se eseguo il ".exe" (Debug o Release non cambia).

Il produttore della DLL, fornisce, con essa, due file (C e C#) contenente la dichiarazione delle funzioni e delle variabili così da prenderne spunto.
Di seguito, la dichiarazione della funzione data dal produttore:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Di seguito, la dichiarazione della funzione nel mio codice Vb.Net
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Qui di seguito, il suo utilizzo all'interno del codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Niente di particolarmente complicato quindi, se non fosse che con i Framework 2.0 e 3.0 la funzione restituisce correttamente il valore "1 - CONNECTED", mentre, con il framework 4.0, genera l'errore "c0000005" quando viene eseguito l'exe compilato in "Debug" o "Release" da VS2010 mentre funziona correttamente se eseguito in "modalità Debug" all'interno di Visual Studio.

ratum99 Profilo | Junior Member

io programmo in c# e quindi faccio un po' fatica a capire il tuo codice cmq,

1) come hai capito anche tu non server copiare l'app.config perchè crea già il file nomeapplicativo.exe.config con le infomazioni.
2) l'istruzione che ti ho detto di aggiungere serve proprio per delle incompatibilità tra versione del framework 3.5 e 4.
perchè non so se sai che mentre i framework 2.0, 3.0 e 3.5 utilizzano lo stesso "motore" il FW 4.0 ne utilizza un'altro.

Se mi dici che questa modifica non basta (a me ha risolto un problema con Crystall Report), probabilmente le dll che usi non sono compatibili con Framework 4.0.

La cosa che dovresti fare è ricompilare le dll per Framework 4.0

Altro non mi viene in mente

-RA-
"Programmare? non è così difficile"

mmjc23 Profilo | Newbie

Ciao Ratum99 e grazie di nuovo per la risposta

Boh...non so cosa dire...purtroppo la DLL mi viene fornita dal produttore del dispositivo e non è semplice chiedergli di modificarla.
Non credo però sia un problema di DLL del produttore; come dicevo, infatti, la DLL funziona correttamente con Framework di versioni precedenti, ma soprattutto, funziona correttamente anche con il Framework 4.0, quando si debugga con Visual Studio.

Oltretutto, va sottolineato anche il fatto che, le altre funzioni della DLL (ne ho provate alcune) funzionano correttamente e non generano alcun tipo di errore anche quando viene eseguito l'exe direttamente.

Purtroppo, non posso nemmeno tornare indietro di versione Framework, perchè altre DLL utilizzate dall'applicativo, richiedono per forza il Framework 4.
Che casino...

ratum99 Profilo | Junior Member

Mi spiace ma non ho altre idee, cmq sembrerebbe che in debug sia avviato o emulato qualcosa che in esecuzione standard non sia attivato o emula.

-RA-
"Programmare? non è così difficile"

mmjc23 Profilo | Newbie

Già...grazie mille comunque per la disponibilità a darmi una mano.
Continuo le ricerche e, se risolvo, posterò qui la soluzione.

Grazie ancora e buona giornata

mmjc23 Profilo | Newbie

Aggiornamento della situazione in base agli ultimi test:

Allora...premetto che il produttore, fornisce due DLL diverse a seconda che l'applicativo giri su CPU x86 o x64.
La mia applicazione, viene compilata in "x86" e viene eseguita sia su sitemi operativi x86 che x64. Per questo motivo, utilizzo sempre la DLL "x86"; infatti, se utilizzo la DLL "x64" sull'applicativo compilato "x86" la DLL genera un errore in fase di avvio/caricamento.

Come si può vedere dagli esiti postati qui sotto, la cosa moooltooo strana è che la funzione/applicativo Framework 4.0 funziona correttamente su di un sistema Windows XP x86, mentre "crasha" (ignorando perfino i "Try-Catch") sugli altri sistemi operativi.
Inutile ribadire che la stessa funzione/applicazione, funziona correttamente su tutti i Sistemi Operativi x86 o x64 con Framework 2.0 e 3.0 (nessuna modifica al codice è stata fatta...si è solo trasportato l'applicativo da Framework 3.0 a 4.0)
-Windows 8.1 (x64) + DLL (x86): APPCRASH
-Windows 7 (x64) + DLL (x86): APPCRASH
-Windows 7 (x86) + DLL (x86): APPCRASH
-Windows XP (x86) + DLL (x86): NESSUN ERRORE

Grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5