|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jan 2009
Messaggi: 16
|
[c#] caricaricare dll dinamicamente - InvalidCastException
Ciao, allora ho il seguente problema:
ho cercato dappertutto il sistema per importare dinamicamente classe metodi e altro da una dll esterna e ho trovato il sistema chiamato Reflection. Allora io agisco in questo modo Codice:
using System; using System.Collections.Generic; using System.Text; namespace KeyCrypt { interface KeyCrypting { string fileconvert(string path); double version(); string idcheck(); } } Codice:
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace KeyCrypt { class BlaBla : KeyCrypting { private double cryptversion = 1.0; string fileconvert(string path) { return "fileconvert"; } double version() { return cryptversion; } string idcheck() { return "ciaciao"; } } } Codice:
Assembly a = Assembly.LoadFile(KryptingKeyPath); foreach (Type tipo in a.GetTypes()) if (tipo.GetInterface("KeyCrypting") != null) { KeyCrypting skeycript = (KeyCrypting)Activator.CreateInstance(tipo); String b= skeycript.ToString(); } ![]() Qualcuno sa aiutarmi? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
uhm, potresti spiegare meglio quale porzione di codice finisce dove e, soprattutto, come sono divisi tra i differenti assembly?
ad ogni modo, ad occhio, l'if nel terzo spezzone non mi convince, magari dopo controllo |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jan 2009
Messaggi: 16
|
allora premetto che non sono ferratissimo però io l'assembly non l'ho toccato l'ho lasciato tutto a visual studio. Detto ciò in teoria non dovendo caricando staticamente la dll ma dinamicamente non dovrebbe essere necessario intervenire sull'assembly a mio parere, no?
Ho trovato su internet di utilizzare quell'if e in effetti facendo un po di debugging in effetti entra al punto giusto, in effetti prima di eseguire Codice:
KeyCrypting skeycript = (KeyCrypting)Activator.CreateInstance(tipo); |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Prova a fare un Quick Watch su "Activator.CreateInstance(tipo)" e vedi che tipo di dice.
|
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jan 2009
Messaggi: 16
|
Con quick watch intendi che devo andare su "Controllo immediato" e richiamare quel metodo?
Se si ho provato e mi dice: Codice:
Activator.CreateInstance(tipo) {KeyCrypt.Blabla} cryptversion: 1.0 ![]() |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Jan 2009
Messaggi: 16
|
A quanto pare il problema sta nella dll, io sviluppando i progetti separatamente ho in entrambi usato l'interfaccia KeyCrypting scritta nello stesso modo, però usando due file diversi ognuno risiede nella sua cartella di progetto, può essere che il programma non riconosce come "identiche" le due classi nonostante siano identiche come codice? Magari nel progetto della dll devo mettere riferimenti alla "medesima" interfaccia che utilizzo nel programma vero e proprio? Se si, come?
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Quote:
Se tu scrivi due interfacce in due assembly diversi, anche se hanno stesso nome e, presumo, stesso namespace, restano 2 interfacce distinte. La cosa più semplice da fare è creare un assembly con l'interfaccia. Creare l'assembly da caricare a runtime via reflection. Creare l'assembly che caricherà l'assembly da caricare a runtime. E negli ultimi 2 assembly linki la reference al primo. Magari si può fondere il primo ed il terzo, ma temo che, quando carichi il secondo, si rischia di avere un'eccezione dovuta ai riferimenti incrociati (a => b e b => a). Sicuramente a compile time questo comportamento non è permesso. Non ne ho idea a run time, magari i controlli sono più "light", ma non ti posso dire nulla di certo! |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:48.