17. februar 2003 - 10:40Der 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!
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 :)
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?
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#!
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; } }
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?
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?
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?
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?
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 :-)
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?
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?
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!
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
Synes godt om
Ny brugerNybegynder
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.