Discussione:
Oggetto COM creato in C# (2)
(troppo vecchio per rispondere)
Simone
2006-07-27 07:29:29 UTC
Permalink
Ciao. Ripropongo il post sperando che qualcuno abbia avuto il mio stesso
problema.
Ho provato a cercare su internet ma non ho trovato niente.

Ho creato un oggetto COM in C#.
Sul mio PC funziona perfettamente.

Lo ho portato su un altro PC (Windows Server 2003). Quando viene eseguito mi
si presenta il seguente errore:

"Sono state caricate 2 copie differenti di MSCOREE.DLL"

Prima copia
<Unknown>

Seconda copia
c:\windows\Microsoft.Net\Framework\v1.1.4322\mscorwks.dll

"Il problema è dovuto in genere alla presenza di un file MSCOREE.DLL
registrato differente da quello collegato in modo statico all'applicazione."

Sapete darmi un aiuto?

Simone.
Raffaele Rialdi [MVP]
2006-07-27 08:13:33 UTC
Permalink
Post by Simone
Ciao. Ripropongo il post sperando che qualcuno abbia avuto il mio
stesso problema.
Ho provato a cercare su internet ma non ho trovato niente.
Ho creato un oggetto COM in C#.
Sul mio PC funziona perfettamente.
Lo ho portato su un altro PC (Windows Server 2003). Quando viene
"Sono state caricate 2 copie differenti di MSCOREE.DLL"
In ogni processo non puoi usare due versioni di CLR.
Mscoree è la dll del framework ed in ogni processo devi usare solo una
versione.

Provo a fare una ipotesi.
- il processo che crea il tuo oggetto COM a sua volta usa già il framework
1.1
- il tuo oggetto com è fatto con il framework 2.0
quindi il processo carica il fx 1.1, va su e poi tenta di caricare l'oggetto
com il quale necessita del fx 2.0, tenta di caricarlo e ovviamente fallisce.

Se è così, la soluzione è quella di usare solo il fx 2.0.
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Simone
2006-07-27 10:53:11 UTC
Permalink
Ciao Raffaele e come sempre grazie per la risposta.
Post by Raffaele Rialdi [MVP]
Provo a fare una ipotesi.
- il processo che crea il tuo oggetto COM a sua volta usa già il framework
1.1
- il tuo oggetto com è fatto con il framework 2.0
quindi il processo carica il fx 1.1, va su e poi tenta di caricare
l'oggetto com il quale necessita del fx 2.0, tenta di caricarlo e
ovviamente fallisce.
Se è così, la soluzione è quella di usare solo il fx 2.0.
Provo a chiarire la cosa:

Il mio oggetto è fatto con VS2003 e quindi utilizzando F1.1.
Sul mio computer (che ha entrami i framework 1.1 e 2.0) funziona.
Su un computer WS2003 (sul quale è presente il framework 1.1) mi da l'errore
di cui ho scritto.

Il processo che crea il mio oggetto COM è fatto in win nativo e quindi non
necessita di F1.1.
E' possibile che ci sia un altro processo che gira su quella macchina che ha
caricato il framework 1.1 prima dle processo che crea l'oggetto COM?

Ciao e grazie.
Fabio
2006-07-27 11:16:06 UTC
Permalink
Post by Simone
Il mio oggetto è fatto con VS2003 e quindi utilizzando F1.1.
Sul mio computer (che ha entrami i framework 1.1 e 2.0) funziona.
Su un computer WS2003 (sul quale è presente il framework 1.1) mi da
l'errore di cui ho scritto.
Domandone: se le due macchine hanno SP del framework 1.1 differenti cosa
succede?
Prova a controllare, magari tenta solo di caricare due versioni differenti
della dll.
Le due ver. del framework non credo che si tocchino a vicenda.

Ciao
Raffaele Rialdi [MVP]
2006-07-27 14:59:48 UTC
Permalink
Post by Fabio
Domandone: se le due macchine hanno SP del framework 1.1 differenti
cosa succede?
Prova a controllare, magari tenta solo di caricare due versioni
differenti della dll.
Le due ver. del framework non credo che si tocchino a vicenda.
Considerato che su un PC non possono esserci la SP0 e la SP1
contemporaneamente installate direi che non dovrebbe essere questa la
motivazione.
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Fabio
2006-07-28 06:22:22 UTC
Permalink
Post by Raffaele Rialdi [MVP]
Post by Fabio
Domandone: se le due macchine hanno SP del framework 1.1 differenti
cosa succede?
Prova a controllare, magari tenta solo di caricare due versioni
differenti della dll.
Le due ver. del framework non credo che si tocchino a vicenda.
Considerato che su un PC non possono esserci la SP0 e la SP1
contemporaneamente installate direi che non dovrebbe essere questa la
motivazione.
No, chiaro.
Intendevo dire che magari su una macchina c'è un SP e sull'altra un altro.
Se le due assembly sono marcate con uno strong name diverso o con una ver.
diversa diventano incompatibili (però credo che in questo caso dia un errore
di assembly not found, quindi dovresti aver ragione tu :) ).

Ciao
Raffaele Rialdi [MVP]
2006-07-27 15:03:33 UTC
Permalink
Post by Simone
Ciao Raffaele e come sempre grazie per la risposta.
Ciao, prego
Post by Simone
Il mio oggetto è fatto con VS2003 e quindi utilizzando F1.1.
Sul mio computer (che ha entrami i framework 1.1 e 2.0) funziona.
Su un computer WS2003 (sul quale è presente il framework 1.1) mi da
l'errore di cui ho scritto.
Il processo che crea il mio oggetto COM è fatto in win nativo e
quindi non necessita di F1.1.
Sicuro sicuro? Fai una prova:
- lancia il processo in questione senza che venga caricata la tua dll
- scaricati l'ultima versione di process explorer (sysinternals.com) e
lancialo
- prendi le proprietà del processo e guarda se c'è un tab chiamato ".NET"
se esiste quel tab, allora il processo usa il framework.
Post by Simone
E' possibile che ci sia un altro processo che gira su quella macchina
che ha caricato il framework 1.1 prima dle processo che crea
l'oggetto COM?
la limitazione è per-processo e quindi vale solo se il processo che carica
il tuo oggetto COM ha già caricato un'altra versione di framework.
Gli altri processi possono fare quello che gli pare
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Simone
2006-07-27 16:42:13 UTC
Permalink
Forse ho trovato:

Prima di chiamare il metodo del mio oggetto COM, il mio processo crea
l'oggetto in memoria tramite la createobject ed ho idea che in quel momento
carichi la prima versione del Framework, poi la chiamata al metodo carica la
seconda che genera l'errore..

Quindi la domanda è: la createobject della mia applicazione perchè carica
una versione di framework che vuole lei?
La createobject non l'ho scritta io è una funzione dell'ambiente di
sviluppo.

Ciao e grazie.
Post by Raffaele Rialdi [MVP]
Post by Simone
Ciao Raffaele e come sempre grazie per la risposta.
Ciao, prego
Post by Simone
Il mio oggetto è fatto con VS2003 e quindi utilizzando F1.1.
Sul mio computer (che ha entrami i framework 1.1 e 2.0) funziona.
Su un computer WS2003 (sul quale è presente il framework 1.1) mi da
l'errore di cui ho scritto.
Il processo che crea il mio oggetto COM è fatto in win nativo e
quindi non necessita di F1.1.
- lancia il processo in questione senza che venga caricata la tua dll
- scaricati l'ultima versione di process explorer (sysinternals.com) e
lancialo
- prendi le proprietà del processo e guarda se c'è un tab chiamato ".NET"
se esiste quel tab, allora il processo usa il framework.
Post by Simone
E' possibile che ci sia un altro processo che gira su quella macchina
che ha caricato il framework 1.1 prima dle processo che crea
l'oggetto COM?
la limitazione è per-processo e quindi vale solo se il processo che carica
il tuo oggetto COM ha già caricato un'altra versione di framework.
Gli altri processi possono fare quello che gli pare
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Raffaele Rialdi [MVP]
2006-08-08 06:56:27 UTC
Permalink
Post by Simone
Prima di chiamare il metodo del mio oggetto COM, il mio processo crea
l'oggetto in memoria tramite la createobject ed ho idea che in quel
momento carichi la prima versione del Framework, poi la chiamata al
metodo carica la seconda che genera l'errore..
Quindi la domanda è: la createobject della mia applicazione perchè
carica una versione di framework che vuole lei?
La createobject non l'ho scritta io è una funzione dell'ambiente di
sviluppo.
La createobject tira su il componente. È poi il componente che si tira
dietro la versione di framework che gli serve. La createobject non sa nulla
del framework e non potrebbe neppure saperne nulla.

Hai fatto passi avanti?
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Simone
2006-08-28 11:35:38 UTC
Permalink
Post by Raffaele Rialdi [MVP]
La createobject tira su il componente. È poi il componente che si tira
dietro la versione di framework che gli serve. La createobject non sa
nulla del framework e non potrebbe neppure saperne nulla.
Hai fatto passi avanti?
Ciao Raffaele.

Si, ho risolto il problema. Il mio ambiente di sviluppo vuole che le DLL
(componenti esterni) che vengono utilizzati al suo interno vengano inserite
in una apposita directory chiamata external. Inizialmente ho messo la DLL in
questa directory e il componente mi generava l'errore.

Ho provato a spostare la DLL in una nuova directory creata da me (con
conseguente cambio di registrazione (parametro /codebase del comando
regasm)).
In questo caso all'interno dell'ambiente di sviluppo trovo cmq il mio
componente COM ma la sua esecuzione non mi genera più l'errore.
Secondo me le dll contenute nella directory external vengono caricate in
memoria all'avvio dell'ambiente di sviluppo (prima versione del Framework
caricata). La successiva chiamata alla funzione createobject carica in
memoria la seconda versione del framework ed ecco quindi l'errore.

Ho verificato questo grazie all'applicativo ProcessExplorer della
Sysinternals.

Ciao e ancora grazie.
Raffaele Rialdi [MVP]
2006-08-28 20:50:26 UTC
Permalink
[...]
La successiva chiamata alla funzione
createobject carica in memoria la seconda versione del framework ed
ecco quindi l'errore.
Ho verificato questo grazie all'applicativo ProcessExplorer della
Sysinternals.
Ciao e ancora grazie.
Prego :)
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Continua a leggere su narkive:
Loading...