Avatar billede Slettet bruger
19. april 2002 - 09:22 Der er 31 kommentarer og
1 løsning

dll komponent i VB.Net

Hey alle sammen
Nogen som kan give mig et link til lidt info omkring hvordan jeg laver en komponent (dll) i vb.net
Avatar billede nute Nybegynder
19. april 2002 - 09:29 #1
du kompilerer dine filer med switchen '/target:library'. Fx:

csc /out:Test.dll /target:library MineFiler.cs

/nute
Avatar billede Slettet bruger
19. april 2002 - 09:36 #2
hmm.. hvordan med VS.net?
Avatar billede Slettet bruger
19. april 2002 - 09:40 #3
I get this error
test.dll was loaded, but the DllRegisterServer entry point was not found.
DllRegisterServer mau not be exported, or a corrypt version of test.dll may be in memory.
Consider using PView to detect and remove it.

jeg har ingen dll regget som test.dll, hvad går jeg, jeg fik samme fejl med VS.net
Avatar billede nute Nybegynder
19. april 2002 - 09:40 #4
Markér din solution i 'Soultion Explorer', Klikk 'Property Page' i din 'Properties' box. Under 'Common properties' skal du sette 'output type' til 'class library' og 'output file' til navnet på din .dll
Avatar billede Slettet bruger
19. april 2002 - 09:48 #5
jeg har ikke noget felt som hedder 'output file' under Common properties :(
Avatar billede Slettet bruger
19. april 2002 - 09:49 #6
men kan det ikke være min kode som der er fejl i?
--------------------
Public Class dotest
    Public Function test(ByVal txt As String)
        test = txt
    End Function
End Class
--------------------

Noget fejl her?
Avatar billede nute Nybegynder
19. april 2002 - 09:54 #7
den kompilerer fint for meg...
Avatar billede Slettet bruger
19. april 2002 - 09:55 #8
fejlen opstår når jeg prøver at regge min dll; regsvr32 dotest.dll
Avatar billede nute Nybegynder
19. april 2002 - 09:56 #9
under 'Common properties' har du punktene 'General', 'Design defaults' og 'Reference Path'.  Inn under General får du i høyre side opp et sett med konfigurasjonsmuligheter...der står også 'output file' (under 'Project')

/nute
Avatar billede nute Nybegynder
19. april 2002 - 09:59 #10
nåja...så er du over i et annet spørsmål plutselig...

Det kan være at det er fordi du mangler en konstruktør i din fil ?!
Avatar billede Slettet bruger
19. april 2002 - 10:02 #11
oki.. slet ikke med..
Jeg går ind i Property Pages.
Ind i Common Properties
Ind i General
Her kan jeg skrive i følgende felter:

hmm, tror lige at jeg prøver i en ikke beta release af VS.net.. skriver lige tilbage om lidt
Avatar billede Slettet bruger
19. april 2002 - 10:02 #12
forklar?
Avatar billede Slettet bruger
19. april 2002 - 10:09 #13
jeg får stadig samme fejl, hvad mengte du med en konstruktør i min fil
Avatar billede nute Nybegynder
19. april 2002 - 10:10 #14
prøv:
Public Class dotest
    Public Sub New()

    End Sub

    Public Function test(ByVal txt As String)
        test = txt
    End Function
End Class
Avatar billede osaka_san Nybegynder
19. april 2002 - 10:18 #15
testkanin> Regge din dll ?

Så vidt jeg er informeret er fordelen ved .net assemblies at de ikke skal regges? - kan godt være dette kun forbeholder sig for asp.net og ikke .net som overordnet? (Jeg er ikke windows applications programmør som det måske kan høres :)

Med Venlig Hilsen
Oscar Eg Gensmann
Avatar billede Slettet bruger
19. april 2002 - 10:19 #16
stadig samme fejl, jeg får denne fejl når jeg siger run i VS.net:
------
A project with an Output Type of Class Library cannot be started directly.
------
Avatar billede Slettet bruger
19. april 2002 - 10:21 #17
osaka_san > oki.. men hvordan skal jeg så kalde min komponent fra f.eks et VBscript?

Set MyTest = CreateObject("test.Class1")
msgbox(MyTest.test("blabla"))

virker ikke
Avatar billede nute Nybegynder
19. april 2002 - 10:24 #18
testkanin >> kanskje du skal lese litt mer om .NET innen du tar fatt på denne type spørsmål ? Dette er en rimelig elementær egenskap ved .NET du gjør om til noe værre enn det det er. klikk inn på http://www.asp.net og les litt om .NET. Alternativt kan du jo kikke på denne lille kodesnipp og se om du ikke kan bli litt inspirert:

http://www.123aspx.com/resdetail.aspx?res=256

/nute
Avatar billede Slettet bruger
19. april 2002 - 10:25 #19
jeg kan godt forstå hvorfor VS.net ikke kan køre den, men jeg kan ikke forstå hvorfor jeg ikke kan regge den..
Avatar billede nute Nybegynder
19. april 2002 - 10:26 #20
jeg kan heller ikke se hvorfor du har behov for å regge den...
Avatar billede Slettet bruger
19. april 2002 - 10:28 #21
ellers så kan jeg ikke bruge den i mit vbscript, eller asp kode, ikke asp.net bare asp
Avatar billede nute Nybegynder
19. april 2002 - 10:38 #22
hmmm...så begynner du å mikse teknologier endel. VB.NET er *ikke* det samme som alminnelig VB. komponenter skrives normalt i VB eller C++.

hva skal fordelen med å blande .NET og classic ASP være ???
Avatar billede osaka_san Nybegynder
19. april 2002 - 10:38 #23
testkanin> taler vi asp.net eller windows application?
Avatar billede Slettet bruger
19. april 2002 - 10:38 #24
jeg skal bruge nogle funktioner som vb.net kan som jeg ikke kan lave i min asp kode
Avatar billede Slettet bruger
19. april 2002 - 10:39 #25
så tækte jeg at de må da kunne snakke sammen..
Avatar billede osaka_san Nybegynder
19. april 2002 - 10:39 #26
Hvis det er web vi taler om, så skal du placere dine dll'er i et dir der hedder "bin" i roden af din webapplication eller virtual directory, så bliver de loadet automatisk når web applicationen compiles.
Avatar billede osaka_san Nybegynder
19. april 2002 - 10:40 #27
hvordan du benytter det fra klassisk ASP skal jeg ikke kunne sige, jeg er normalt ikke fortaler for at blande gamle og nye versioner af samme teknologi.
Avatar billede Slettet bruger
19. april 2002 - 10:42 #28
:), jeg har bare brug for at den kan kalde min dll så min dll kan gøre sit arbejde og retunere OK, eller fejl til min asp side.. og det er det.. virker underligt hvis man ikke kan gøre det med en vb.Net dll
Avatar billede nute Nybegynder
19. april 2002 - 10:46 #29
testkanin >> man bruker ikke en skruetrækker til å slå en søm inn i veggen med selv om den ligger i samme verktøjskasse som en hammer !! Dvs. man *kan* gjøre det, men den er ikke beregnet til å gjøre det.

På samme måte er det med ASP og ASP.NET. Begge kommer fra M$, men hensikten med dee to teknologier skal *ikke* sees på som det samme. Bruk teknologiene til det de er beregnet til !! Så får du også et mer stabilt produkt i siste ende...

/nute
Avatar billede Slettet bruger
19. april 2002 - 10:52 #30
nute > jeg kan godt lide din samligning med en skruetrækker og søm, og jeg ved at der rigtigt skal bruges asp.Net til det, men det har jeg ikke fået leget med endnu.. jeg tror at jeg vil se om jeg kan finde en anden løsning.. :)
Tak for jeres tid gutter..

/testkanin
Avatar billede prh Nybegynder
01. maj 2002 - 23:29 #31
Der er ingen problemer med at lave COM Components i .NET, ie, komponenter der kan kaldes fra f.eks VBScript... Der er dog visse krav...

1) Den skal være signed... Ie :
[assembly:AssemblyKeyFile(@"C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\Applications\LoanApps\COMtoNET\loanlib\sample.snk")]

Hvis pathen er stien til et keypair...

2) Versionering er en god ide...
[assembly:AssemblyVersion("1.4.0.0")]

3) Class Inteface'et skal defineres, typisk virker AutoDual dog.
[ClassInterface(ClassInterfaceType.AutoDual)]

4) Så skal du have et navn og referere til, et ProgID (foran din klasse)
[ProgId("Mit.Navn")]

De fleste metoder og properties vil der efter automatisk kunne kaldes gennem COM...

Nu kommer så den sjove del...

Efter at have Compilet det til en DLL fil skal DLL'en proppes i GAC'en og regges til at køre som en COM komponent...

I mit tilfælde hedder min komponent for EQComponent.dll så :

regasm EQComponent.dll /tlb:eqcomponent.tlb
gacutil -i EQComponent.dll

Skal kaldes ude fra f.eks en command line...

Vupti... Du kan nu lave en..

Server.CreateObject("Mit.Navn")

Og kalde metoder etc...

Der er også muligheder for COM+ support men, det lyder ikke som om at det er nødvendigt...
Avatar billede prh Nybegynder
01. maj 2002 - 23:30 #32
Her er hele sourcen på den fil jeg har min klasse i, bare som et eksempel :

using System;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
using System.Threading;
using System.Runtime.InteropServices;
using System.Data.SqlClient;
using RagingFury.EQ.SupportClasses;

[assembly:AssemblyKeyFile(@"C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\Applications\LoanApps\COMtoNET\loanlib\sample.snk")]
[assembly:AssemblyVersion("1.4.0.0")]

namespace EQComponent
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("EQ.Items")]
    public class  Items
    {
        private RFWS.ItemsWebservice ourRef = new RFWS.ItemsWebservice();
       
        public string GetItemInfo(int ItemID)
        {
            string result = "";
            string cookie = "";
            string stats = "";

            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://www.magelo.com/components/eq_item_info.jsp");
            myRequest.AllowAutoRedirect = true;

            myRequest.Referer = "http://www.magelo.com/eq_item_info.html?num="+ItemID.ToString();

            myRequest.CookieContainer = new CookieContainer(10);

            HttpWebResponse ourResponse = (HttpWebResponse)myRequest.GetResponse();
            Stream receiveStream = ourResponse.GetResponseStream();
            StreamReader readStream = new StreamReader( receiveStream);//, encode );

            foreach (Cookie thisCookie in myRequest.CookieContainer.GetCookies(new Uri("http://www.magelo.com")))
                if (thisCookie.Name == "JSESSIONID")
                    cookie = "Cookie: JSESSIONID="+thisCookie.Value;
           
            Char[] read = new Char[256];

            int count = readStream.Read( read, 0, 256 );

            while (count > 0)
            {
                string str = new string(read, 0, count);
                result += str;
                count = readStream.Read(read, 0, 256);
            }

            ourResponse.Close();

            Regex myReg;
            Match myMatch;

            myReg = new Regex(@"new item_struct\(\d+,\'(?<1>.*?)\',", RegexOptions.IgnoreCase|RegexOptions.Multiline);
           
            string itemName = "";

            for (myMatch = myReg.Match(result); myMatch.Success; myMatch = myMatch.NextMatch())
            {
                itemName = myMatch.Groups[1].Value;

                if (itemName.Substring(itemName.Length-1, 1) == @"\")
                    itemName = "";
            }

            itemName = itemName.Replace(@"\'", "'");

            // NAME AND COOKIE FOUND
            myRequest = (HttpWebRequest)WebRequest.Create("http://www.magelo.com/components/eq_item_shot.jsp?num="+ItemID.ToString());

            myRequest.AllowAutoRedirect = true;

            myRequest.Referer = "http://www.magelo.com/eq_item_info.html?num="+ItemID.ToString();

            myRequest.Headers.Add(cookie);

            ourResponse = (HttpWebResponse)myRequest.GetResponse();
            receiveStream = ourResponse.GetResponseStream();
            readStream = new StreamReader( receiveStream);//, encode );

            read = new Char[256];

            count = readStream.Read( read, 0, 256 );

            while (count > 0)
            {
                string str = new string(read, 0, count);
                result += str;
                count = readStream.Read(read, 0, 256);
            }

            ourResponse.Close();

            result = result.Replace("&nbsp;", " ");
            result = result.Replace("<br>", " ");
            result = result.Replace("  ", " ");
            result = result.Replace("  ", " ");

            result = result.Replace("SV DISEASE", "SVD");
            result = result.Replace("SV POISON", "SVP");
            result = result.Replace("SV COLD", "SVC");
            result = result.Replace("SV FIRE", "SVF");
            result = result.Replace("SV MAGIC", "SVM");
           

            myReg = new Regex(@"Slot: (?<1>.*)", RegexOptions.IgnoreCase|RegexOptions.Multiline);
            myMatch = myReg.Match(result);
           
            if (myMatch.Success)
                stats = myMatch.Groups[1].Value;

            myReg = new Regex(@"(?<1>Effect: <script type=""text/javascript"">if\(typeof\(spell_url\)!=""undefined""\) document\.write\(""<a href='""\+spell_url\+""\?num=\d+' target='_parent'>.*?</a>""\); else document.write\("")(?<2>.*?)(?<3>""\);</script>)", RegexOptions.IgnoreCase);

            myMatch = myReg.Match(stats);
           
            string effect = "";
            string effectname = "";

            if (myMatch.Success)
            {
                effect = myMatch.Groups[0].Value;
                effectname =  myMatch.Groups[2].Value;

                stats = stats.Replace(effect, "Effect: "+effectname);
            }

            if (stats == "")
                itemName = ((string)(itemName + " - not wearable.")).Trim().Replace(@"\'", "'");
            else
                itemName = ((string)(itemName + " - " + stats)).Trim().Replace(@"\'", "'");
           
            return itemName;
        }

        public string GetSingleItem(string pattern)
        {
            RFWS.itemInfo[] itemID;

            itemID = ourRef.GetItems(pattern);

            if (itemID.Length == 0)
                return "No item matching the given pattern was found";

            return GetItemInfo(itemID[0].ItemID);
        }

        public string GetSingleItemWithCost(string pattern)
        {
            RFWS.itemInfo[] itemID;

            itemID = ourRef.GetItems(pattern);

            if (itemID.Length == 0)
                return "No item matching the given pattern was found";

            return GetItemInfo(itemID[0].ItemID)+" - Cost : " + itemID[0].ItemCost.ToString();


        }

        public string FindItems(string pattern)
        {
            RFWS.itemInfo[] itemID;
            string result = "";

            itemID = ourRef.GetItems(pattern);

            if (itemID.Length == 0)
                return "No item matching the given pattern was found";

            for (int i = 0; i <= itemID.GetUpperBound(0); i++)
                result += itemID[i].ItemID.ToString()+ " - " + itemID[i].ItemName + " (Cost : " + itemID[i].ItemCost.ToString() + ")<CR>";

            return result;
        }

        public bool IsOfficer(string name)
        {
            return ourRef.IsOfficer(name);
        }

        public bool IsMember(string name)
        {
            return ourRef.IsMember(name);
        }

        public RFWS.dkpInfo DKPPoints(string name)
        {
            return ourRef.DKPPoints(name);
        }

        public string DKP(string names)
        {
            AdvancedSortedList ourList = new AdvancedSortedList();
            ourList.KeyName = "Points";

            string resultText = "";
            string currentName = "";
            int result;
            int current = 0;
           
            result = names.IndexOf(",", current, names.Length);
           
            while (result >= 0)
            {
                currentName = names.Substring(0, result);
                names = names.Substring(result+1, names.Length-result-1);
           
                points = ourRef.DKPPoints(currentName.Trim());
               
                ourList.Add(new dkpPerson(currentName.Trim(), 0, 0));

                result = names.IndexOf(",", current, names.Length);
            }

            points = ourRef.DKPPoints(names.Trim());
            ourList.Add(new dkpPerson(names.Trim(), 0,0));

            foreach (dkpPerson ourPerson in ourList.GetEnumeratorWithSort("Points", true))
                resultText += ourPerson.Name + ": " + ourPerson.Points.ToString() + "<CR>";

            return resultText;
        }

        private class dkpPerson
        {
            private string name;
            private int points;
            private int totalPoints;

            public dkpPerson(string name, int points, int totalPoints)
            {
               
                this.name = name;
                this.points = points;
                this.totalPoints = totalPoints;
            }

            public string Name
            {
                get
                {
                    return name;
                }
            }

            public int Points
            {
                get
                {
                    return points;
                }
            }

            public int TotalPoints
            {
                get
                {
                    return totalPoints;
                }
            }
        }

    }
}

Skod kode men det virker til spillet :P
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