Toon posts:

[C#] COM Classes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben momenteel bezig met een C# DLL die gebruikt word in het pakket ArcGIS.
Alles werkt prima, dockable windows, command buttons, enz...

Nu is m'n probleem:

Die classes worden in een bepaalde volgoorde ingeladen, in elke zelfstandige
(com) class declareer ik een class "clsLog". Deze gebruik ik om de method
logClass.logToFile aan te roepen...

Wat ik eigenlijk wil is voor elke com-class een shared class aan te maken die
iedere com-class kan aanroepen. Dan kan ik alle log-messages daarheen sturen
en die klasse checkt dan wel weer of het ArcMap dockable logForm aangemaakt is en stuurt het door naar dat form.

(Momenteel kan ik alleen met de ArcMap ICommand klasse naar een gezamelijk UID scannen omdat bij de creatie van dat object een hook pointer meegegeven wordt.)

Ik hoop niet dat het te wazig is :P, vind het lastig om het probleem goed te omschrijven...

Alvast bedankt voor reacties!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Als ik het goed begrijp, wil je dus een errorlog-class die je binnen iedere class kunt gebruiken?

Bedoel je dan dat je een class wilt aanmaken waarvan je de methods kunt aanroepen zonder dat je een instance van die class nodig hebt?
zoja, kijk dan eens naar static methods.

Ik vind je topicstart wel wat wazig eigenlijk... Misschien kan je eea verduidelijken.
Wat heeft COM hier trouwens mee te maken? :?

(Trouwens, is gebruik maken van de Tracing mogelijkheden binnen C# geen oplossing?)

[ Voor 30% gewijzigd door whoami op 03-10-2003 13:33 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
'k ben nieuw in c#, dus ik ken nog niet alle features :p van de taal...

ff ter verduidelijking:

ArcMap maakt gebruik van ArcObjects, een collectie COM components die de gebruiker
kan uitbreiden met eigen componenten gebaseerd op ArcObjects COM objecten.
Met .NET produceer ik een DLL met meerdere .NET classes, dan zet ik de optie register for com interoperability aan zodat ArcMap de .NET componten herkend als COM. andersom kan trouwens ook, erg advanced allemaal...:P

Ik wil dus een class hebben (met eventueel GUID) waarin ik met al die andere com-classes bij kan. Dus de eerste com class die gemaakt wordt maakt de globale class aan, en dan de rest checkt of die al bestaat en anders wordt die gemaakt. Je werkt binnen C# toch binnen een namespace, kan daar niet iets mee gedaan worden?

  • Surehand
  • Registratie: Februari 2003
  • Laatst online: 18-08 15:40
Als het alleen gaat om loggen kun je wellicht eens naar log4net kijken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Hmmm, klinkt dus als een Singleton class.

Misschien kan je eens kijken naar het singleton design pattern. Dit patroon zorgt ervoor dat je altijd slechts 1 instance van een class kunt hebben.

In short ziet dat er ongeveer zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SingletonLogger
{

   private static SingletonLogger      _logger;

   private SingletonLogger()
   {
   }
 
   public static SingletonLogger getInstance()  
   {
          if( _logger == null )
          {
               _logger = new SingletonLogger;
          }
          return _logger;
   }
}

oid.

https://fgheysels.github.io/


Verwijderd

Topicstarter
thanx, ik ga nu wat proberen met dat singleton pattern.... heb de c# code + uitleg ook gevonden

http://www.devhood.com/tu...ails.aspx?tutorial_id=486

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
namespace DesignPatterns
{
    /// <summary>
    /// Singleton class implements that simplest version of the Singleton 
    /// design pattern.
    /// </summary>
    public sealed class Singleton
    {
        private static readonly Singleton    instance = new Singleton();

        // make the default constructor private, so that no can directly create it.
        private Singleton()
        {
        }

        // public property that can only get the single instance of this class.
        public static Singleton Instance
        {
            get 
            {
                return instance;
            }
        }
    }
}

// code to access the Singleton.
using System.Diagnostics;
using DesignPatterns;

Trace.WriteLine(Singleton.Instance.ToString());

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Euh, nou, omdat 't COM is zou 't nog wel eens heel goed kunnen zijn dat die COM-classes in verschillende geheugenruimten zitten (ligt eraan of ze als inproc-servers zijn gemaakt (dll), of als out-of-process servers (.exe)).

In het laatste geval zal het Singleton-pattern niet zonder meer werken - een private static variabele is de enige instantie _binnen die geheugenruimte_. Dus als de COM-classes in meerdere geheugenruimten zitten, is er een instantie voor elk en werkt het pattern niet naar behoren.

--edit--
Nu ik je bericht nog eens een paar keer rustig heb doorgelezen, maak ik eruit op dat je alle classes in dezelfde dll hebt geimplementeerd. Maar daarna zeg je:
Die classes worden in een bepaalde volgoorde ingeladen
Ik neem aan dat je met 'ingeladen' eigenlijk 'geinstantieerd' bedoeld (d.w.z. 'geheugen gealloceerd voor dit object, en de constructor aangeroepen', en niet 'ingeladen vanaf disk') ?

Als je 'geinstantieerd' bedoelt is het bovenstaande niet van toepassing en zou het singleton-pattern gewoon moeten werken.

[ Voor 36% gewijzigd door MrBucket op 03-10-2003 20:14 ]


Verwijderd

Topicstarter
MrBucket schreef op 03 October 2003 @ 19:58:

Nu ik je bericht nog eens een paar keer rustig heb doorgelezen, maak ik eruit op dat je alle classes in dezelfde dll hebt geimplementeerd. Maar daarna zeg je:
[...]
Ik neem aan dat je met 'ingeladen' eigenlijk 'geinstantieerd' bedoeld (d.w.z. 'geheugen gealloceerd voor dit object, en de constructor aangeroepen', en niet 'ingeladen vanaf disk') ?

Als je 'geinstantieerd' bedoelt is het bovenstaande niet van toepassing en zou het singleton-pattern gewoon moeten werken.
Ja, ik bedoelde eigenlijk het creeren (inladen was een ietswat onhandig woord) van die classes. 'geinstantieerd' (duur woord :p) dus.... Maar het werkt prima, dus
die singleton was een goeie tip!
Pagina: 1