[.NET] VB.NET Assembly gebruiken in C#

Pagina: 1
Acties:

  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Op het bedrijf hier gebruiken ze een framework voor het ophalen van data. Dit werd geschreven in VB.NET, gecompileerd naar een DLL.

Deze DLL willen we nu gaan gebruiken in C#. Op zich geen probleem, ware het niet dat iedere methode slechts op 1 manier is op te roepen. (overloaded methodes zijn niet toegankelijk)

Iemand die hier raad mee weet? Op Google heb ik al wat gezocht, maar het is een nogal vaag probleem om in een zoekopdracht te omschrijven...

  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Hoezo, overloaded methods zijn niet beschikbaar ? In VB.NET kan je toch ook gewoon overloaded methods aanroepen ?
Hoe weet je dat ze niet toegankelijk zijn ?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ik snap niet helemaal wat je bedoelt. Als je in c# een .net ( dus vb.net, j#, jscript.net, c# haalt allemaal niet uit ) refferenct dan kan je die gewoon normaal gebruiken.

“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.”


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Een vereenvoudigd voorbeeldje: De VB.NET DLL die in C# wordt gebruikt bevat deze methods:
code:
1
2
Public Sub DoeIets(ByVal pA As String) ...
Public Sub DoeIets(ByVal pA As String, ByVal pB As Integer) ...


Als we deze assembly in C# gebruiken, dan zien we enkel de eerste DoeIets(pA, pB) in Intellisense. Als we DoeIets(pA) gebruiken (niet in het Intellisense lijstje), dan geeft ook de compiler een fout ("No overloaded method DoeIets accepts 1 parameter)

  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 29-04 14:06

ThunderNet

Flits!

moet je niet iets als Public Overloaded Sub DoIets gebruiken?
Hoe moet de compiler anders weten wat jij bedoeld met 2 verschillende subs :)

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Net even met de reflector gekeken: in de DLL staat parameter pB als "optional", m.a.w. is er geen overload gebruikt.

Iemand een idee of C# optional parameters ondersteunt?
edit:
--> Neen... (http://builder.com.com/5100-6373-1050652.html)

Iets anders bedenken dus...

[ Voor 93% gewijzigd door maartenba op 03-10-2005 14:39 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Kan je er dan niet omheen werken door System.Reflection.Missing.Value oid mee te geven als argument aan die functie ?

Aangezien C# dit optional gedoe niet ondersteund, zal dat dus ook niet CLS Compliant zijn. Ik bouw m'n assemblies altijd met ClsCompliant attribute true.
code:
1
[assembly: CLSCompliant(true)]


Zeker in dit geval -aangezien het dus een framework dll betreft- zou dit ook zo moeten gebeurd zijn...

[ Voor 62% gewijzigd door whoami op 03-10-2005 14:42 ]

https://fgheysels.github.io/


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Helaas is het dus niet zo gebeurd... Ik ga eens even wat researchen over System.Reflection.Missing.Value.

  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Misschien handig voor de referentie: een wrapper class die een Invoke kan uitroepen op methodes met optionele parameters.

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
32
33
34
35
36
37
38
39
40
41
    public class Wrapper {
        public static object Invoke(ref object pObject, string pMethod, object[] pParams) {
            return pObject.GetType().GetMethod(pMethod).Invoke(pObject, pParams );
        }

        public static object Invoke(ref object pObject, string pMethod, object p1) {
            return Invoke(ref pObject, pMethod, new object[]{p1});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3, object p4) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3, p4});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3, object p4, object p5) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3, p4, p5});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3, object p4, object p5, object p6) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3, p4, p5, p6});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3, object p4, object p5, object p6, object p7) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3, p4, p5, p6, p7});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3, p4, p5, p6, p7, p8});
        }

        public static object Invoke(ref object pObject, string pMethod, object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8, object p9) {
            return Invoke(ref pObject, pMethod, new object[]{p1, p2, p3, p4, p5, p6, p7, p8, p9});
        }
    }


Gebruik:
code:
1
object result = Wrapper.Invoke(objectWaarMethodeOpWordtUitgeroepen, "MethodeNaam", param1, param2); // Kan tot 9 parameters


Misschien niet de mooiste code; wel makkelijk om mee te werken.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
waarom maak je gebruik van een hoop dezelfde functions??

je kan dan toch ook gewoon gebruik maken van het params keyword. Dan hoef je maar 1 functie te maken die voor elk aantal parameters werkt.
code:
1
2
3
4
5
6
7
8
9
10
public class Wrapper {
    public static object Invoke(ref object pObject, string pMethod, params object[] pParams) {
        return pObject.GetType().GetMethod(pMethod).Invoke(pObject, pParams );
    }
}

en dan in je code gewoon

Wrapper.Invoke( pObject, "Method", "a" );
Wrapper.Invoke( pObject, "Method", 1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10, 11 );

[ Voor 80% gewijzigd door Woy op 03-10-2005 18:08 ]

“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.”


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Da's inderdaad wel een stuk mooier! Bedankt! _/-\o_

(kom zelf uit de VB.net wereld en heb daar nog nooit van "params" gehoord)

[ Voor 23% gewijzigd door maartenba op 03-10-2005 19:54 ]

Pagina: 1