Avatar billede tjalle Nybegynder
19. september 2002 - 18:33 Der er 37 kommentarer og
2 løsninger

Distribution af filer i exe, dll og assemblies..

Hejsa.

Tiden er snart kommet til det punkt hvor min nye .NET-applikation skal distribueres. Den er kodet objektorienteret, i 5 lag:

1. Databaselag
2. Klasselag
3. Serverlag
4. Klientlag
5. Grænsefladelag

Disse 5 kan sagtens ligge i samme exe-fil, og det er da også .NET's default måde at gøre tingene på.

Men er der fordele i at bruge dll'er til de 4 nederste lag, så de kan skiftes ud?

Hvordan passer dette med det nye Assembly-begreb ?

Og ikke mindst hvordan laves denne opsplitning i .NET?

Tj.
Avatar billede tuxic Nybegynder
19. september 2002 - 19:53 #1
Jeg ved ikke om det er .NETs måde at gøre det på at samle det hele i een og samme exe.
Det er vel en fordel at bruge 4 dll'er at du kan udskifte tilgengæld betyder det (lidt) længere opstarts tid da dll'erne skal loades.
Det passer fint med Assembly begrebet fordi din application er et Assembly og et Assembly kan bestå af en eller flere dll eller exe filer.
Opslitningen laves ved at du compilerer det der skal være dll som libraries og under compilationen af exe'en refererer du dll'erne.
Avatar billede tuxic Nybegynder
19. september 2002 - 19:53 #2
Ah, hvad mener du egentligt med at Server og klient lag? De skal vel ikke lige i samme Assembly?
Avatar billede odegaard Nybegynder
19. september 2002 - 20:05 #3
Man kan vel godt tolke en del af noget software, som en klient der kommunikerer med kernen (serveren) af softwaren, som leverer data ?
Avatar billede z42cool Nybegynder
19. september 2002 - 21:25 #4
Du laver 5 separate filer der hver indeholder sit eget lag og definerer hvert sit sub namespace, f.eks. MinApp.Lag1, MinApp.Lag2, etc. De 4 nederste lag (som jeg går ud fra mangler entry points) kompilerer du med /target:library. I sourcen i det 5. lag bruger du using MinApp.Lag1, using MinApp.Lag2, etc. Det 5. lag (det der har et entry point) kompilerer du med /target:winexe /r:lag1.dll /r:lag2.dll /r:lag3.dll /r:lag4.dll og så sørger du naturligvis for at distribuere alle 5 filer samlet!
Avatar billede tuxic Nybegynder
19. september 2002 - 22:33 #5
Bemærk, Namespaces har ikke noget med filer at gøre.
Avatar billede tjalle Nybegynder
20. september 2002 - 08:47 #6
som odegaard så rigtigt siger det, så er der tale om server-/klient-lag, som begge ligger på samme maskine. de er lavet så man senere kan skifte dem ud, og derved have en LAN-baseret tcpip applikationion, eller en WAN-baserest http-appikation.

> z42cool: Hvert lag består af 2 filer. et interface og den implementerede klasse. Eks. iSQLConnection.vb og MSSQLConnection, som er interface og implementeringen til MS SQL SERVER. dette lag skal i en dll....

men du nævner sub-namespaces... hvordan laver jeg disse ??

Tj.
Avatar billede tjalle Nybegynder
20. september 2002 - 09:23 #7
har set eksempler på at namespaces erklæres i koden ??

som :
NameSpace 'tekst'

End Namespace

vil det sige at en vb-fil godt kan indrholde flere namespaces ??
Avatar billede tjalle Nybegynder
20. september 2002 - 11:37 #8
Damm det her er besværligt !

Jeg har altså 5 lag, hvert lag med 2 til flere klasser (og .vb-filer).

Jeg skal nu have kompileret 5 dll'er (4 som lag og 1 som samling af mine andre klasser) og 1 exe.

nedeste dll skal indeholde 2 *.vb filer...
Men hvordan fanden får jeg kompileret dem sammen.

i min kommandoPrompt skriver jeg:
"c:\xxx\vbc /target:library iSQLConnection.vb"

men den tager kun en fil som argument. Derfor fejler den når den ikke kan finde den klasse der implementerer den. Desuden fejler den fordi den ikke kan fine system.data (framework-namespace jeg benytter).

Hvad gør jeg galt ??

Tj.
Avatar billede tjalle Nybegynder
20. september 2002 - 12:03 #9
hvad fanden gør jeg galt ?
hvorfor kan den ikke finde system.data og de andre jeg importerer...

Det virker jo fint når VS selv kompilerer det....
Avatar billede tjalle Nybegynder
20. september 2002 - 12:58 #10
E:\Database>vbc /t:library /out:sqlcon.dll ISQLConne
ction.vb SqlServerConnection.vb
Microsoft (R) Visual Basic .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.00.3705.209
Copyright (C) Microsoft Corporation 1987-2001. All rights reserved.

E:\Vss Projects\Tecnical Layer\Database\ISQLConnection.vb(4) : error BC30466: Na
mespace or type 'Data' for the Imports 'System.Data' cannot be found.

Imports System.Data
        ~~~~~~~~~~~
E:\Vss Projects\Tecnical Layer\Database\ISQLConnection.vb(5) : error BC30466: Na
mespace or type 'SqlClient' for the Imports 'System.Data.SqlClient' cannot be fo
und.

Imports System.Data.SqlClient
        ~~~~~~~~~~~~~~~~~~~~~
E:\Vss Projects\Tecnical Layer\Database\ISQLConnection.vb(19) : error BC30002: T
ype 'SqlDataReader' is not defined.

        Function qSelect(ByVal s As String) As SqlDataReader
 

og så videre......... Dammm
Avatar billede z42cool Nybegynder
20. september 2002 - 13:50 #11
Du kan sagtens give compileren mere end en source fil,

"c:\xxx\vbc /target:library iSQLConnection.vb source_file2.vb"
Avatar billede tjalle Nybegynder
20. september 2002 - 21:48 #12
ja det har jeg fundet ud af, men det er dog ikke problemet nu!
Problemet er at den mangler alle de inbyggede namespaces som jeg bruger i mit program... eks:

System.data
System.net
osv....... (se mit tidligere indlæg..)

Hvad gør jeg galt ?
Avatar billede tuxic Nybegynder
20. september 2002 - 21:55 #13
Asso hvis du refererer et assembly der indeholder et namespace kan du enten skrive Imports 'navn' eller fx.
System.Console.WriteLine.
Men du skal huske at refererer den dll fx. system.net ligger i, under compileringen. Til csc compileren skriver man /r: mon ikke oxo det kan bruges her
Avatar billede tjalle Nybegynder
20. september 2002 - 21:59 #14
Det hænger da ikke rigtigt sammen.
Hvordan skulle jeg nogensinde kunne gætte i hvilken dll System.net ligger i (den ligger ikke som selvstændig fil).

Desuden kan man jo have programmer der importerer mange andre namespaces...

Har prøvet /r: - men aner ikke hvad jeg skal linke til...
Avatar billede tuxic Nybegynder
20. september 2002 - 22:08 #15
ja det er ikke nemt. Men det er sådan det virker. Hvordan finder man så ud af i hvilken dll et namespace ligger? Tjah msdn, ellers prøv ildasm på dll'erne. (De ligger sammen med .NET installationen) Eller den sidste udvej er at bruge anakrino som laver (C#) dekompilering af assemblies
Avatar billede tjalle Nybegynder
20. september 2002 - 22:13 #16
men stadigvæk.. hvorfor?

jeg importerer dem jo i starten af min applikation... De må da ligge i .NET frameworket at abstrahere fra deres fysiske placering når først de er registrret som assembly....
Avatar billede tuxic Nybegynder
20. september 2002 - 22:16 #17
Nej. namespace og assemblies er forskellige ting. Et namespace er en compilerteknisk foranstaltning. Det eneste et namespace gør er, at inddele variabel navne i grupper. Dermed kan man mere frit selv finde på variabel navne i store projekter.
Avatar billede tjalle Nybegynder
20. september 2002 - 22:25 #18
korrekt!

men det kan da ikke være rigtigt at jeg skal sidde og kigge alle Dll'er igennem for at finde System.Net -> det tror jeg simpelthen ikke på passer..

Desuden kan jeg ikke finde det omtalt nogen steder på nettet...
Avatar billede tjalle Nybegynder
20. september 2002 - 22:44 #19
Se evt. her :: http://www.dotnetextreme.com/code/GETComputernameandIP.asp

Der omtales system.net.dll... jeg har dog ikke denne fil ?
Avatar billede tjalle Nybegynder
20. september 2002 - 22:50 #20
én ting er system.net... men den kan fanme heller ikke finde ud af at kompile når man bruger en ArrayList....
Avatar billede tuxic Nybegynder
20. september 2002 - 23:09 #21
Se, ArrayList er jo en del System.Collections
Avatar billede tjalle Nybegynder
23. september 2002 - 08:54 #22
det kan simpelthen ikke være sandt!
men hvis jeg skal tro dig, må du hjælpe med at finde dll'er til følgende namespaces..

Imports System.Security.Principal
Imports System.Net
Imports System.IO
Imports System.Resources

Ellers kan jeg ikke få det testet igennem...
Avatar billede tjalle Nybegynder
23. september 2002 - 08:57 #23
man skulle tror at System.Sequrity indeholder alt med sequrity.. men nej nej, principal er ikke i denne...

i System.Squrity er kun: System.Squrity.Cryptography.xml <- DAMM !!
Avatar billede tjalle Nybegynder
23. september 2002 - 09:21 #24
OK.. dette burde kompile mit program:

vbc /t:library /out:methods.dll /r:system.dll /r:mscorlib.dll /r:System.drawing.dll methods.vb

Da mscorlib.dll indeholder: "IO", "Collections", "Resources" & "Principal".
System.dll indeholder: "Net".

Det virker dog stadigvæk ikke......
Den melder fejl på ArrayList... men den ligger altså i System.dll !!!

Det kan simpelthen ikke være måden..
Avatar billede z42cool Nybegynder
23. september 2002 - 09:42 #25
Det ER måden, men hvis den giver en compiler fejl på ArrayList er det en manglende "Imports System.Collections". I øvrigt bliver mscorlib.dll og system.dll automatisk refereret af c-skarp kompileren, mon ikke også det gælder for vb kompilere´n?
Avatar billede tjalle Nybegynder
23. september 2002 - 09:56 #26
det kan jeg fortælle at de ikke gør...

Har fået hul på bylden! den første dll er kompilet..

NU er jeg igang med den næste, og der skal jeg bruge den første jeg har lavet...

Den første:
vbc /t:library /out:methods.dll /r:system.dll /r:mscorlib.dll /r:System.drawing.dll methods.vb

Den anden:
vbc /t:library /out:sqlcon.dll /r:methods.dll  /r:system.data.dll /r:system.dll /r:mscorlib.dll iSQLConnection.vb SqlServerConnection.vb

Men nr. 2 fejler på "imports nn2002.methods (som er mit namespace for den 1. dll)". Den siger :
error BC30466: Namespace or type 'Methods' for the imports 'nn2002.Methods' cannot be found.

Hvordan klarer jeg den ?
Avatar billede tjalle Nybegynder
23. september 2002 - 09:57 #27
når jeg åbner methods.dll via min assemblySpy (ser indholdet af en assembly), så er der ingen data i den. methods.dll indeholder ingen klasse, men et et modul med statiske metoder (getNTUser() osv...).
Avatar billede tjalle Nybegynder
23. september 2002 - 10:00 #28
når jeg åbner den exe-fil vs selv laver, kan jeg se alle mine namespaces:

nn2002.classes
nn2002.sqlcon
nn2002.storage
osv...

men nn2002.method figurer ikke... er det derfor den ikke kan finde den? og hvad er løsnignen ?
Avatar billede tjalle Nybegynder
23. september 2002 - 10:27 #29
så snart jeg fjerner referencen til mit namespace "nn2002" (specifikt: nn2002.methods (og samtidigt alle kald til metoder i denne)) så kompiler alt fint...

hvordan kompiler jeg så referencen til mit eget namespace "nn2002" kommer til at virke?
Avatar billede tjalle Nybegynder
23. september 2002 - 13:00 #30
> Z42Cool -> vi har snakket om det før:

Når jeg erklærer mine namespaces så bliver denne:

Namespace classes
    Public Class News
        Private intNId As Integer
        Private strText As String
        Private strHeadline As String
    End Class
End Namespace

..automatisk kaldt via [projektNavn].[Namespace] -> dvs. i mit projekt nn2002.classes... Dette namespace kan importeres i andre klaser i VS.NET uden problemer...

når jeg nu kompiler ovenstående via prompten, kommer [ProjektNavn] jo ikke med, da det er klassen direkte jeg kompiler. News kommer altså til at ligge i namespaces [Classes].

Jeg tror netop dette er mit problem. Efter kopiling i DOS kan jeg ikke henvise til nn2002.classes fra andre filer, da DLL'en indeholder classes UDEN nn2002 foran !!!

Hvordan skal jeg så erklære mine namespaces så

"Namespace classes" betyder opret namespace nn2002.classes

Håber du/I forstår ??

Tj.
Avatar billede z42cool Nybegynder
23. september 2002 - 14:16 #31
????? Du er lidt svær at forstå, men her er hvordan dit problem løses for 2 filer, så kan du selv udvide det:

//SRCFILE 1, LIBRARY (MyLibrary.vb)

Namespace MyLibrary
  Public Class MyClass
    Public Sub MyMethod
    End Sub
  End Class
End Namespace

kompileres med:
vbc /target:library /out:MyLibrary.dll MyLibrary.vb

//SRCFILE 2 - PROGRAM (MyProgram.vc)
'Nu kan vi undlade at fuldt kvalificere klasser fra vores eget namespace
Imports MyNamespace   

Namespace MyProgram
  Public Class App
    Public Shared Sub Main
      Dim myCls As MyClass  'Kun pga. imports
      myCls.MyMethod()
    End Sub
  End Class

kompiler med:
vbc /target:winexe /r:MyLibrary.dll /out:MyProgram.exe MyProgram.vb

Det er vigtigt at have /r med da imports kun er til for at hjælpe med navneresolution!
Avatar billede tjalle Nybegynder
23. september 2002 - 14:27 #32
>> Z42Cool - jeg er egentligt udemærket med på ovenstående..
Men lad mig lige udvide dit eksempel...

Dine 2 vb-filer herover er lavet i VS.NET, og lad os sige at projekt hedder : "WindowsApplikation1". I mit tilfælde vil dit projekt ikke importere MyNameSpace. min vil kun hvis du kalder den med imports Windowsapplication1.MyNamespace.

Windowsapplication1.MyNamespace virker i VS. men når jeg så kompiler i DOS fjernes Windowsapplication1 da det kun er vb-filen der kompileres og ikke hele projektet !!!

Tj.

Er du med? eller ska jeg forklare endnu dybere?
Avatar billede tuxic Nybegynder
23. september 2002 - 18:31 #33
Bare en kommentar angående i hvilket assembly en given klasse, metode etc. ligger: Det fremgår umiddelbart af dokumentationen for den pågældende klasse, metode etc.
Avatar billede tjalle Nybegynder
23. september 2002 - 23:18 #34
>tuxic.. Det man kan se er en henvisning til det tilhørende namespace.. Men du kan ikke ligefrem se hvilken assembly (dll eller exe).

Under System.Net står igenting om at dette namespace findes i filen system.dll

eller hvad med System.collection.arraylist. Den findes i en dll ved navn mscorlib.dll...

Ikke ligefrem indlysende !
Avatar billede tuxic Nybegynder
23. september 2002 - 23:43 #35
Avatar billede tuxic Nybegynder
23. september 2002 - 23:44 #36
Se nederst på siden: Assembly: Mscorlib (in Mscorlib.dll)
Avatar billede tjalle Nybegynder
25. september 2002 - 08:36 #37
mange gange undskyld... det havde jeg ikke set !
Avatar billede tjalle Nybegynder
25. september 2002 - 08:42 #38
jeg har efterhånden fået kompilet mit projekt. Har dog stadig problemer som langtfra er logiske... Men med lidt fuskeri i koden kan jeg kompile via prompten.

eks.

min klasse SqlServerConnection.vb importerer nn2002.classes, da alle mine forretningsmodel-klasser ligger i denne. Dette virker fint i VS-NET.

Når jeg kompiler SqlServerConnection.vb til en dll fra prompten, kan den ikke finde nn2002.classes, da classes jo også er lavet fra prompten, og derfor ikke ligger i nn2002.classes, men bare i classes.

men andre ord at (dll)kompile en klasse skaber altid en klasse i det namespace man angiver (eks. namespace classes), når man kompiler den fra VS, bliver namespacet = [projektet (i VS)].[NAMESPACE].

Derfor er min kode i vs.net som importerer nn2002.classes ikke valid når jeg kompiler fra prompten. Løsningen blev at ændre namespacet (fra classes til nn2002.classes) sætningen i vs.net, og derved bevidst lave en syntaksfejl, derefter kompilere den via prompten (som derfor kommer til at virke). Derefter lave namespacet tilbage i vs og arbejde videre...

Tj.
Avatar billede tjalle Nybegynder
14. oktober 2002 - 12:12 #39
tak for god debat!
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
Kurser inden for grundlæggende programmering

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