Toon posts:

[.NET / C#] Detectie van applicatie type

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een Logger aan het schrijven die voor verschillende applicatie types op een andere manier moet loggen.

Voor een console applicatie naar de console.
Voor een service naar de event log.
Voor een windows applicatie met een form.

Ik wil dit doen met een Singleton met de naam Logger zodat je alleen Logger.Instance.Log(...) hoeft aan te roepen. Deze klasse komt in een library.

Ik weet alleen niet hoe ik in de Logger kan detecteren wat voor type de huidige applicatie is. Ik kan het niet vinden in de help en google.

Weet iemand dus hoe je kan weten of de huidige applicatie een console, windows of een service applicatie is?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Kan je niet dmv reflection gaan bekijken van welke class je applicatie overerft?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nee dat zal niet gaan lukken omdat je applicatie niet van een klasse afgeleid is. Zover ik weet tenminste. Volgens mij is er niet zoiets als een klasse die je applicatie voorstelt.

Nog uitgezocht:
System.Console kan niet gebruikt worden omdat deze geen exception gooit als het geen Console Applicatie is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 18 September 2003 @ 12:09:
Nee dat zal niet gaan lukken omdat je applicatie niet van een klasse afgeleid is. Zover ik weet tenminste. Volgens mij is er niet zoiets als een klasse die je applicatie voorstelt.
De applicatie niet nee, maar de class die je application entry-point bevat wel.

https://fgheysels.github.io/


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

Het verschil tussen een winexe en een exe wordt door de compiler bepaald (entry point van je app). Dit is niet iets dat je terug vindt met reflectie. Maar wat je kan doe is een attribute toevoegen, bv target dat aangeeft wat je assably is. Hierna kan je met reflectie kijken hoe je moet gaan loggen.

[ Voor 5% gewijzigd door dotcode op 18-09-2003 12:26 ]


Verwijderd

Topicstarter
Dat zou een idee zijn, maar ik kan me niet voorstellen dat je hiervoor extra attributen nodig hebt.

Ik had verwacht dat je EntryAssembly die informatie wel kon leveren.
En anders het AppDomain of de Environment klasse.

[ Voor 13% gewijzigd door Verwijderd op 18-09-2003 12:34 ]


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

Je zal hier niet terug vinden of het een service is. Dit is namelijk een interface die je moet inplementeren en moet registeren in de registry. Je kan natuurlijk kijken of deze klasse voorkomt in je assembly, maar dan hoeft het nog geen service te zijn.

Verwijderd

Topicstarter
Nope, klopt.
Ben hetvolgende aan het proberen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private ApplicationType GetApplicationType() 
{
    MethodInfo methodInfo = Assembly.GetEntryAssembly().EntryPoint;
    Type type = methodInfo.DeclaringType;
    ApplicationType returnAppType = ApplicationType.Console;

    while (type != typeof(object)) 
    {
        switch (type.FullName) 
        {
            case "System.ServiceProcess.ServiceBase":
                returnAppType = ApplicationType.Service;
                break;
            case "System.Windows.Forms.Form":
                returnAppType = ApplicationType.Windows;
                break;
        }
        type = type.BaseType;
    }

    return returnAppType;
}


- Bepaal de entry point (Assembly.GetEntryAssembly().EntryPoint)
- Bepaal de klasse waarop hij zit (methodInfo.DeclaringType)
- Loop in een loop door de basis klassen heen en vergelijk de klasse naam

[ Voor 16% gewijzigd door Verwijderd op 18-09-2003 15:51 ]


  • OMX2000
  • Registratie: Januari 2001
  • Laatst online: 21-08 16:51

OMX2000

By any means necessary...

je hoort je logger niet al de verschillende typen applicaties te "leren". Je moet je applicaties laten bepalen waar ze willen loggen via je standaard logger. Dus de output moet de applicatie zelf bepalen. Niet hard coderen dat een console altijd naar de console logt etc etc.

Dè developers podcast in je moerstaal : CodeKlets Podcast


  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
Ik ben even kwijt waar het stond (ik gok weblogs.asp.net, goeie site trouwens), maar daar stond in ieder geval dat alleen het entrypoint (main, page, etc..) bepaald wat een applicatie doet. Zo kan je bijvoorbeeld met een truukje ook een library standalone gebruiken of natuurlijk een exe als library gebruiken.

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


Verwijderd

Topicstarter
In dit geval wil ik juist afdwingen dat bepaalde methoden voor loggen standaard gebruikt worden. Dit zal echter wel aan te passen zijn met initialisatie code.
Nu hoef je alleen na te denken als je iets op een specifieke manier wilt loggen en kan ik de standaard makkelijk wijzigen.

De code die ik hierboven gaf werkt trouwens. De enige beperking is dat je je main van een Windows app in een afgeleide van Form moet declareren en de main van een service in een afgeleide van ServiceBase.

  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

De code ziet er leuk uit, maar je kan ook een Forms app als console app opstarten. Kijken naar een form is niet zo zinvol dan. Ook kan het natuurlijk anders om dat er geen form in je app zit...

Verwijderd

Topicstarter
Daar heb je gelijk in, maar een forms app als console starten gebruik ik niet.
Tevens kan ik dan in die consoled windows app extra configuratie opnemen.

Dotcode, wat bedoel je met "Ook kan het natuurlijk anders om dat er geen form in je app zit..."?

[ Voor 4% gewijzigd door Verwijderd op 19-09-2003 10:14 ]

Pagina: 1