webForumDet fria alternativet

C# typecast problem

4 svar · 299 visningar · startad av adde2

adde2Medlem sedan maj 2000144 inlägg
#1

Hej!
Jag har ett problem med en typecasting.
Jag försöker läsa in en "assembly" via en dll och allokera ett objekt från assemblyn.
Att allokera objektet går utmärkt men när jag jag försöker typecasta det så kraschar det (
System.InvalidCastException )
Jag läste en artikel där dom läser in dynamiskt dll'er och skapar objekt. Och det vill jag också göra.
I mitt fall så vill jag kunna lägga dll filer i en mapp och sen ska programmet/programmen läsa in de dll'erna, som ett plugin system. (Anledningen till detta är att programmet arbetar i ett nätverk och jag vill slippa lägga upp dll'erna på varje dator utan vill lägga dom på en delad resurs på nätverket. Samt kunna lägga till dll'er med ny funktionalliet allt eftersom att jag får lust.)
I mitt fall så består det av tre delar (eller flera)
1. Exefilen eller själva huvudprogrammet.
2. En dll med delade resurser, innehåller lite konstanter och klasser som är tänkt att användas lite varstans.
3. plugin dll'en.

Både exefilen och plugin filen har varsin referens till dll filen med de delade resurserna. exefilen och och pluginfilen känner dock inte till varandra.

/*delade resursfilen:
(innehåller fler saker men det är ointressant just nu)*/
public interface template_interface
{
   void go();
}
//Plugin filen
public class Template3 : System.Windows.Forms.Form, template_interface
{
  public Template3(){
    //micklar
  }
  
  public void go()
  {
    //micklar mera
  }
}
/*Huvud exefilen 
  läser in dll filen, letar reda i dll filen efter den klassen implementerar gränssnittet template_interface
*/
Type type;
//initierar type och förvissar mig om att den implementerar gränssnitet template_interface
object o = Activator.CreateInstance(type);  //funkar utmärkt
template_interface ti = (template_interface)o; /*kastar typecastexception, trots att den implementerar gränssnittet. 
Går iofs att slå ihop raderna till en rad men jag har separerat på dom i avlusningssyfte.*/

Hoppas jag har varit tillräckligt tydlig.

Jag är tacksam för all hjälp jag får. :)

GladhMedlem sedan maj 20012 812 inlägg
#2

Prova följande kod, den fungerar för mig.

ObjectHandler objHandler = Activator.CreateInstanceFrom("SÖKVÄG_TILL_DLL","FULLA_NAMNET_PÅ_CLASSEN_ALLTSÅ_MED_ASSEMBLYNAME")
template_interface ti = (template_interfavce)objHandler.UnWrap();

- Magnus

adde2Medlem sedan maj 2000144 inlägg
#3

Tack för hjälpen.
Men jag får det inte att fungera.
Den fortsätter att generera System.InvalidCastException
Fast nu på

template_interface ti = (template_interface)objHandler.Unwrap();

:(

-Andreas

renholmMedlem sedan apr. 20012 266 inlägg
#4

För att se vilken type det är skulle du väl kunna testa att köra .GetType().ToString() och se att allt verkligen ser ut som det ska.

adde2Medlem sedan maj 2000144 inlägg
#5

hmm, intressant. för kör jag gettype() så får jag bara basklassen.
kör jag gettype().getInterfaces() så får jag bara ett interface. (och det är inte det interfacet jag implementerar, eller ja det är ju implementerat men inte det jag vill ha med)

Kör jag däremot min ursprungliga kod och getInterfaces så finns det interfacet med (det som jag försöker typecasta till)

126 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)