[C#] Hoe uit te vinden of een assembly bestaat?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een ddl waar een usercontrol in zit, als deze dll bestaat (dit hoeft niet in alle gevallen zo te zijn) moet de usercontrol geladen worden.

In 1e instantie ging ik er vanuit dat de dll bestaat en had onderstaande code:
code:
1
2
3
4
namespacename.classname myUserControl = Page.LoadControl("~/test.ascx") as namespacename.classname;
HtmlGenericControl divControl = sender as HtmlGenericControl;
// voeg control toe
 divControl.Controls.Add(miUserControl);


Nu is het dus niet zeker of "namespacename.classname" bestaat.
Ik denk dan gebruik ik Reflection, maar met
Assembly assembly = Assembly.Load("namespacename.classname"); kan ik geen null afvangen.

hoe kan ik er voor zorgen dat ik weet of de assembly bestaat en als deze bestaat, dat ik dan de usercontrol inlaat.

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Moet je perse het type weten? Kan je niet gebruik maken van een Interface?

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eek schreef op woensdag 24 februari 2010 @ 08:42:
Moet je perse het type weten? Kan je niet gebruik maken van een Interface?
Ja dat moet inderdaad.
Of kan ik gewoon gebruik maken van Type.GetType?

Acties:
  • 0 Henk 'm!

Verwijderd

Ik weet niet of dit helpt want ik snap jou vraag niet hierboven.

var myTypes = new List<Type>();

var assembly = Assembly.Load("MyProject.Components");

foreach (var type in assembly.GetTypes())
{
if (type.GetInterfaces().Contains(typeof(ISuperInterface)))
{
myTypes.Add(type);
}
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 24 februari 2010 @ 08:58:
Ik weet niet of dit helpt want ik snap jou vraag niet hierboven.

var myTypes = new List<Type>();

var assembly = Assembly.Load("MyProject.Components");

foreach (var type in assembly.GetTypes())
{
if (type.GetInterfaces().Contains(typeof(ISuperInterface)))
{
myTypes.Add(type);
}
}
Ik kan de usercontrol benaderen:
code:
1
2
Assembly assembly = Assembly.Load("namespace.classname");
Type MyTypeObject = assembly.GetType("namespace.classname.usercontrolename");


Echter nu wil ik hier nog gebruik van maken om te komen tot:
namespace.classname.usercontrol uc = Page.LoadControl("~/test.ascx") as namespace.classname.usercontrol;

[ Voor 29% gewijzigd door Verwijderd op 24-02-2010 09:45 ]


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Kan je hem niet typecasten naar een basis class zoals WebControl of Control? Zo nee dan ben ik natuurlijk ook benieuwd waarom dat niet kan.

[ Voor 29% gewijzigd door eek op 24-02-2010 10:05 ]

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eek schreef op woensdag 24 februari 2010 @ 10:05:
Kan je hem niet typecasten naar een basis class zoals WebControl of Control? Zo nee dan ben ik natuurlijk ook benieuwd waarom dat niet kan.
Ja ik denk dat het gewoon gaat, je krijgt dan zoiets:

code:
1
2
3
4
5
6
 Assembly assembly = Assembly.Load("namespace.class");
Type MyTypeObject = assembly.GetType("namespace.class.usercontrol");
UserControl MyControl = Activator.CreateInstance(MyTypeObject) as UserControl;
MyControl = Page.LoadControl("~/test.ascx") as UserControl;
HtmlGenericControl divControl = sender as HtmlGenericControl;
divControl.Controls.Add(MyControl);


Hiermee heb ik de usercontrol te pakken, deze heeft echter specieke properties, hoe kom ik daar dan bij?

[ Voor 6% gewijzigd door Verwijderd op 24-02-2010 11:07 ]


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Hiervoor zou je dan gebruik moeten maken van een interface.

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Tenzij je vantevoren echt niet weet welke properties en methods er zijn, dan zou je gebruik kunnen maken van reflection, maar dat is traag, foutgevoelig en je code wordt er niet leesbaarder op.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Uiteindelijk had ik het zo opgelost, ik weet niet of dit onnodig moeilijk is?

code:
1
2
3
4
5
6
7
Assembly assembly = Assembly.Load("namespace.class");
Type MyTypeObject = assembly.GetType("namespace.class.usercontrol");
PropertyInfo pi = MyTypeObject.GetProperty("pi");     
UserControl MyControl = Activator.CreateInstance(MyTypeObject) as UserControl;
MyControl = Page.LoadControl("~/test.ascx") as UserControl;
HtmlGenericControl divControl = sender as HtmlGenericControl;
divControl.Controls.Add(MyControl);

Acties:
  • 0 Henk 'm!

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
code:
1
2
3
4
5
6
7
Assembly assembly = Assembly.Load("namespace.class");
Type MyTypeObject = assembly.GetType("namespace.class.usercontrol");
PropertyInfo pi = MyTypeObject.GetProperty("pi");     
UserControl MyControl = Activator.CreateInstance(MyTypeObject) as UserControl;
MyControl = Page.LoadControl("~/test.ascx") as UserControl;
HtmlGenericControl divControl = sender as HtmlGenericControl;
divControl.Controls.Add(MyControl);


Je zoekt het type helemaal uit, en maakt een instance van.
Verder access je dat ding niet, maar bouw je met een string alsnog een nieuwe instatie van het usercontrol.?

Waarom niet gewoon een Page.LoadControl met een try catch erom?
Pagina: 1