Dictionary vanuit C# library bruikbaar maken voor VBscript

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
Is het mogelijk om een C# dictionary COM visible te maken met behoud van al z'n properties/methods?

Ik heb het werkend gekregen door gebruik te maken van een ArrayList maar hierin kan je niet iets op key terugvinden. Een volledige werkende versie heb ik ook maar ben ik niet blij mee. In C# maak ik gebruik van een hashtable waarin de lijst van objecten staan. Vervolgens heeft de class een functie die een object-array met alle keys oplevert. Daarnaast is er een functie die op basis van de key de value ophaalt.

Wat ik wil is eigenlijk in .NET 1 functie die gewoon een Dictionary oplevert waarvan al z'n properties/methods gewoon bruikbaar zijn in VBscript. Is zoiets mogelijk?

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
VBScript heeft zelf al een dictionary :? [google=vbscript dictionary] >> http://www.devguru.com/te.../quickref/dictionary.html

[ Voor 56% gewijzigd door RobIII op 20-10-2012 14:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Een dictionary is een Generic type, en die kun je zover ik weet niet via COM exposen. Wat je wel kunt doen is gebruik maken van de non-generic type Hashtable.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
Ja maar de Hashtable laat z'n methods in VBscript niet zien. Tenminste...niet bij mij.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    [ComVisible(true)]
    public class Selectiecode3Collection : Hashtable
    {
        private static Hashtable lijst = null;

        [ComVisible(true)]
        public void GetLijst()
        {
            if (lijst == null)
            {
                lijst = DatabaseFuncties.Tabellen.GetSelectiecodes3();
            }
        }
    }


Bovenstaande de code. Als ik van dit een DLL maak en deze met regasm registreer dan kan ik vanuit VB6/ASP een object creeren. Ik kan de methode GetLijst uitvoeren ... maar bijna alle properties/methods van de hashtable zijn niet bruikbaar. De Hashtable wordt gewoon gevuld met een lijst van 3 objecten.

Echter geeft de Count property van het object weer wel wat terug, namelijk de waarde 0.

Als ik de code vervang door onderstaande geeft ie nog steeds 0 terug:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
    [ComVisible(true)]
    public class Selectiecode3Collection : Hashtable
    {
        private static Hashtable lijst = null;

        [ComVisible(true)]
        public void GetLijst()
        {
            lijst = new Hashtable();
            lijst.Add("KA", "Kalender");
        }
    }


De keys en values en item property/method/collections zijn allemaal niet bruikbaar.
Als je het object in bijv. vb6 bekijkt heeft ie volgens de de code editor geen enkele property/method/collection. De methode "GetLijst" is dus echter wel aan te roepen. Enig idee?

[ Voor 0% gewijzigd door Woy op 22-10-2012 11:49 ]

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Hoezoe heb je dan in je object ook weer een static Hashtable lijst die je gebruikt?

Met deze code is het logisch dat je bij Count 0 terug krijgt, immers zal er in het object zelf geen enkel element gezet zijn. Je code is in ieder geval nogal onlogisch.

Als ik het zo zie snap ik uberhaupt niet waarom je een subclass van Hashtable maakt en niet gewoon meteen de hashtable terug geeft.

offtopic:
met [code=c#][/code] kun je gebruik maken van code highlighting, ik heb het nu even voor je aangepast.

[ Voor 33% gewijzigd door Woy op 22-10-2012 11:50 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
Heb het hele static verhaal er overal uit gehaald maar blijft 0 opleveren. Ik kan overigens vanuit ASP wel elementen aan de Hashtable toevoegen kwam ik achter. Oftewel methode Add werkt ook.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja je hebt zeker de code als volgt aangepast?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
[ComVisible(true)] 
    public class Selectiecode3Collection : Hashtable 
    { 
        private Hashtable lijst = null; 

        [ComVisible(true)] 
        public void GetLijst() 
        { 
            lijst = new Hashtable(); 
            lijst.Add("KA", "Kalender"); 
        } 
    }

Dan is het niet gek dat het nog steeds niet werkt. Probeer eerst eens goed te begrijpen wat je nu aan het doen bent, en waarom dat niet werkt.( Hint: Waar is de variabel lijst voor nodig? )

[ Voor 4% gewijzigd door Woy op 22-10-2012 12:15 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ComVisible(true)]
    public class Selectiecode3Collection : Hashtable
    {
        public Hashtable lijst = null;

        [ComVisible(true)]
        public void GetLijst()
        {
            if (lijst == null)
            {
                lijst.Add("KA","Kalender");
            }
        }
    }


De variabele lijst gebruik ik voor het geval de lijst al gevuld is.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 07-07 16:39
Tja, hoe moeten we dit uitleggen, wat is je classe? een Hashtable, en waarom zou een Hashtable nog eens een 2e hashtable moeten bevatten?

Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
Ik geloof dat dit al genoeg was :) Hij werkt nu wel. Hoewel ie de collection keys en values e.d. nog steeds niet kent. Ik kan niet door de collectie heen lopen.
kippetje01 schreef op maandag 22 oktober 2012 @ 12:24:
Tja, hoe moeten we dit uitleggen, wat is je classe? een Hashtable, en waarom zou een Hashtable nog eens een 2e hashtable moeten bevatten?

[ Voor 14% gewijzigd door Nutcaze op 22-10-2012 12:32 ]

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Leg nou eerst eens uit waarom je in je Hashtable nog weer een andere Hastable hebt? Dat lijkt met totaal overbodig.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
Dat is niet meer zo. Ik heb nu dus ook alle elementen in m'n object zitten. Ik kan alleen niet bij de collections: Keys, Values. Dat betekent simpelweg dat ik er in ASP niet doorheen kan lopen.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 09-07 12:11
Geen idee of je het probleem al getackeld hebt.
Maar wat men je duidelijk probeerde te maken is dat je klasse een HashTable overerft.
Klasse Selectiecode3Collection is dus een hashtable. Het is dan onzin om een variabele van het type hashtable te gebruiken.

Acties:
  • 0 Henk 'm!

  • Nutcaze
  • Registratie: Oktober 1999
  • Laatst online: 01-05 23:17
Dat weet ik en dat is al lang opgelost. Echter zijn de Collections Keys en Values niet bereikbaar vanuit ASP. Tevens heb ik geconstateerd dat de Hashtable de volgorde van de ingevoerd items wijzigt. Gedrag wat ik niet wil.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Nutcaze schreef op dinsdag 23 oktober 2012 @ 14:22:
Dat weet ik en dat is al lang opgelost. Echter zijn de Collections Keys en Values niet bereikbaar vanuit ASP. Tevens heb ik geconstateerd dat de Hashtable de volgorde van de ingevoerd items wijzigt. Gedrag wat ik niet wil.
Als de volgorde van je items van belang is lijkt Hashtable me niet de juiste datastructuur.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Is het niet gewoon eenvoudiger als je gewoon een wrapper voor de generic list maakt?

C#:
1
2
3
4
5
6
7
8
[ComVisible(true)] 
public class Selectiecode3Collection : List<string, string>
{
    public Selectiecode3Collection()
    {
       Add("KA", "Kalender");
    }
}


Vervolgens kun je Selectiecode3Collection gebruiken vanuit VBScript. Is een trucje welke ik ook al eens met een VB6 app heb uitgehaald, dus zou ook moeten werken met VBScript..

If it isn't broken, fix it until it is..

Pagina: 1