Avatar billede frosig Nybegynder
17. februar 2003 - 10:40 Der er 28 kommentarer og
1 løsning

c# og vb

Jeg sidder her og leger lidt med et gammelt microsoft-produkt, Team Manager... Jeg prøver at få lov til at oprette en instans af programmet i c#. Jeg har ud fra dokumentationen til programmet fundet frem til at koden ser således ud i vb

Dim tm As Object
tm = CreateObject("TeamManager.Application")
tm.Open(False, "C:\\Program Files\\Microsoft Team Manager\\Sample.mtp")

Hvordan får jeg det oversat til C#? Jeg har prøvet bare at lave en ny instans af programmet med new, men det kan jeg ikke få lov til, fordi klassen er abstrakt!

Er der nogen derude, der har en løsning?
Avatar billede z42cool Nybegynder
17. februar 2003 - 10:44 #1
Hvis klassen er abstrakt bliver du nødt til at arve den!
Avatar billede z42cool Nybegynder
17. februar 2003 - 10:45 #2
public class MyTeamManager : TeamManager.Application
{
  //Her skal der sikkert overrides nogle abstrakte metoder
}

public class App
{
  public static void Main()
  {
    MyTeamManager mngr = new MyTeamManager();
  }
}
Avatar billede burningice Nybegynder
17. februar 2003 - 10:59 #3
z42cool>> dit eksempel tager da udgangspunkt i at TeamManager er en .Net klasse, ikk'?

hvis du udvikler i Visual Studio.Net skal du under references vælge Add Reference og så kigge under COM fanebladet, og adde din TeamManager. Du kan herefter oprette en instans af objectet ved at skrive

<klassens navn> tm = new <klassens navn>
tm.open(argumenter)


der der nemlig sker når du adder en reference i VS er at den laver en såkaldt wrapper for dig, så du kan snakke med COM som om det var .net-kode :)
Avatar billede burningice Nybegynder
17. februar 2003 - 11:02 #4
der er forresten en masse læsestof omkring COM Interop i sdk'et

ms-help://MS.NETFrameworkSDK/csref/html/vcwlkCOMInteropPart1CClientTutorial.htm
Avatar billede z42cool Nybegynder
17. februar 2003 - 11:05 #5
cyberfessor>> Jeg har taget udgangspunkt i at han allerede har wrappet klassen da han skriver at han har forsøgt at instantiere det med new!
Avatar billede frosig Nybegynder
17. februar 2003 - 11:12 #6
z42cool >> Jeg tror, at du har helt ret, men nu har jeg et nyt problem... Jeg kender intet til vb, og i den klasse, jeg forsøger at arve fra, er der nogle metoder og nogle properties. Jeg kan godt finde ud af at implementere metoderne, men hvordan skal jeg gøre med properties'ne?
Avatar billede z42cool Nybegynder
17. februar 2003 - 11:15 #7
Hvis du skriver i c#:

public override MyProp
{
  get
  {
    //Din implementering her
  }
  set
  {
    //Din implementering her
  }
}
Avatar billede z42cool Nybegynder
17. februar 2003 - 11:16 #8
Det gør ingen forskel hvilket sprog den oprindelige klasse er skrevet i når du bruger .Net. Du kan sagtens arve en VB klasse og skrive din subklasse i c#!
Avatar billede burningice Nybegynder
17. februar 2003 - 11:16 #9
z42cool>> det har han da også... hehe :) ja, så er din kode nok ikke helt hen i skoven ;)

frosig>> du skal ikke gøre noget... når du arver, arver du også automatisk alle metoderne og propertiesne... hvis de altså er public.
ellers, properties fungerer på denne måde:

public string EnStreng {
    get {
        return variabel;
    }
    set {
        variabel = value;
    }
}
Avatar billede frosig Nybegynder
17. februar 2003 - 11:35 #10
z42cool >> Det kan jeg ikke helt få til at virke... Kan du ikke skære det ud i pap for mig?!?

Jeg har f.eks. en property, der hedder Name. Den returnerer en string og er read-only. Kan du ikke skrive koden i C# for mig?
Avatar billede burningice Nybegynder
17. februar 2003 - 11:45 #11
public string Name {
  get {
      return base.Name
  }
}
Avatar billede z42cool Nybegynder
17. februar 2003 - 11:48 #12
Hvis den klasse du arver har en readonly abstract eller virtual property så skal du:

public override string SammeNavnSomBaseKlasseProp
{
  get
  {
    //Din implementation her
  }
}
Avatar billede frosig Nybegynder
17. februar 2003 - 12:22 #13
z42cool >> Jeg kan ikke få det til at virke, hvis jeg skriver override, men den accepterer det, hvis jeg bare undlader det. Hvis jeg bare skal have den til at returnere strengen, hvad skriver jeg så???

cyberfessor >> Jeg kan ikke skrive base.Name som returværdi, og hvis jeg skriver noget lignende TeamManager.Application.Name, så siger den, at der skal bruges en objekt-reference, men sådan en kan jeg ikke få lov til at lave, når det er en abstrakt klasse... Nogle idéer?
Avatar billede z42cool Nybegynder
17. februar 2003 - 12:33 #14
Du kan ikke tilgå properties uden at have en reference så du bliver nødt til at arve TeamManager.Application og så din subklasses arvede properties!
Avatar billede burningice Nybegynder
17. februar 2003 - 13:24 #15
frosig>> altså.. hvis du i din nye klasse arver fra TeamManager.Application, så kan du også skrive base.Name... det kan dog være at den brokker sig over protection-level, gør den det?
Avatar billede frosig Nybegynder
17. februar 2003 - 13:38 #16
cyberfessor >> Hvis jeg skriver base, så kommer compileren ud og siger, at der ikke findes nogen definition af Name i object (Jeg har gættet, at base er object-klassen og ikke TeamManager.Application). Kan du hjælpe med det?

Til jer begge...

Den kode, som jeg har skrevet i vb, starter Team Manager op vha. CreateObject-metoden, så jeg kan forestille mig, at der burde sket cirka det samme i c# for at få det til at fungere. Det kan jeg slet ikke forestille mig, at man kan gøre vha. implementationen af den abstrakte klasse. Har I nogen idéer til det?
Avatar billede z42cool Nybegynder
17. februar 2003 - 13:47 #17
Hmmm.... Nu har du tabt mig..... Hvis vi lige skal tage det fra starten, så:

1) Du vil gerne lave dit projekt i c# - korrekt?
2) Du har lavet en COM Callable Wrapper (CCW) til den dll fil der indeholder TeamManager.Application klassen - korrekt?
3) Når du refererer din CCW og forsøger at instantiere klassen med new TeamManager.Application() får du at vide at klassen er abstrakt - korrekt?
Avatar billede frosig Nybegynder
17. februar 2003 - 14:00 #18
1) Ja
2) Jeg har tilføjet en reference til dll-filen, men jeg har ikke gjort andet. Skal der mere til?
3) Ja

Hele historien er den, at jeg sidder med noget dokumentation til programmet, hvor der står, hvordan man skal gøre i VB, så det prøvede jeg lige hurtigt. Det virkede uden problemer, men desværre så er det et krav fra den virksomhed, som jeg laver opgaven for, at programmet bliver udviklet i C#, så derfor skal jeg have det til at virke der også.
Jeg er selv Java-programmør og har aldrig før leget med hverken VB eller C#. Jeg har heller aldrig prøvet at få to programmeringssprog til at "snakke" sammen.
Det er grunden(e) til at jeg er lidt på herrens mark med alt det her. Det virkede så nemt i VB...

P.s. Der skal nok falde lidt flere point af, når og hvis vi kommer frem til en løsning :-)
Avatar billede z42cool Nybegynder
17. februar 2003 - 14:07 #19
Hvis du bruger vs.net, så er det nok at tilføje en reference, så laver den selv en CCW. Kvis du kan lave klassen med CreateObject i VB, så er den nok ikke abstract, men måske hedder den noget andet end TeamManager.Application. Den dll du skal snakke med, er det en du evt. kan sende per email eller man kan få fat i på en anden måde?
Avatar billede frosig Nybegynder
17. februar 2003 - 14:21 #20
Jeg vil gerne sende den... Hvor skal den sendes til?
Avatar billede z42cool Nybegynder
17. februar 2003 - 14:27 #21
asj@webworx.dk
Avatar billede frosig Nybegynder
17. februar 2003 - 14:38 #22
Så er den sendt
Avatar billede z42cool Nybegynder
17. februar 2003 - 14:50 #23
Det ser lidt mærkeligt ud - der er kun abstrakte klasser i din interop dll og der er ikke implemenation af nogen metoder. Kan du ikke prøve at sende den dll du har lavet din interop dll ud fra?
Avatar billede frosig Nybegynder
17. februar 2003 - 15:00 #24
Jeg tror, at den er genereret ud fra en fil, der hedder MSTMGR1.OLB... Den har jeg i hvert fald sendt til dig
Avatar billede frosig Nybegynder
17. februar 2003 - 17:34 #25
z42cool >> Jeg har lige sendt dokumentationen til programmet til dig også...
Avatar billede z42cool Nybegynder
17. februar 2003 - 18:19 #26
Hvad fanden er en .wri fil?
Avatar billede frosig Nybegynder
17. februar 2003 - 18:32 #27
Det ved jeg da ikke... Jeg kan åbne den i WordPad
Avatar billede z42cool Nybegynder
19. februar 2003 - 09:14 #28
Jeg kan ikke få TeamManager interop klassen til at virke! De andre interop klasser (fra MS)indeholder ikke kun abstrakte typer, men den fra TeamManager gør og så er man jo ligevidt :-( Desværre!
Avatar billede frosig Nybegynder
18. oktober 2003 - 18:29 #29
Ups.. Jeg har vist helt glemt at lukke dette spørgsmål... Jeg fik det aldrig til at virke (Jeg brugte VB.NET, der ikke havde noget problem med at lave instanser af de abstrakte klasser).

z42cool >> Du får alligevel pointene, som tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester