none
C# Webclient DownloadFile Problem in einer DLL

    Frage

  • Hallo,

    Ich habe folgendes Problem:

    using System;
    using System.Net;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Reflection;
    
    
    
    namespace SampReal
    {
        class SampReal
        {
        string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        WebClient client = new WebClient ();
        client.DownloadFile("http://www.contoso.com/library/homepage/images/ms-banner.gif","ms-banner.gif");
        }
    }
    
    

    Bdei diesem Code bekomme ich folgende Errors:

    Error 1:
    
    Fehler	1	Ungültiges Token "(" in Klasse, Struktur oder Schnittstellenmemberdeklaration.	C:\Users\hallo1\documents\visual studio 2010\Projects\SampReal\SampReal\SampReal.cs	17	24	SampReal
    
    
    
    
    Error 2:
    
    Fehler	2	"SampReal.SampReal.client" ist ein(e) "Feld", wird aber wie ein(e) "Typ" verwendet.	C:\Users\hallo1\documents\visual studio 2010\Projects\SampReal\SampReal\SampReal.cs	17	5	SampReal
    

    Es muss eine DLL bleiben da sie automatisch etwas in einem Spiel Updaten soll.

    Freitag, 10. Mai 2013 10:27

Antworten

  • Die DLL muss eine Klasse besitzen. Der Code in der CS-Datei lautet:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SampReal
    {
        public class SampReal
        {
            public static void DonwloadFile()
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient();
                client.DownloadFile("http://www.contoso.com/library/homepage/images/ms-banner.gif", "ms-banner.gif");
            }
        }
    }
    

    Dann der Aufruf in der EXE:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication231
    {
        class Program
        {
            static void Main(string[] args)
            {
                SampReal.SampReal.DonwloadFile();
            }
        }
    }
    

    Gucke dir mal die Grundlagen zu Methoden usw. an.

    http://msdn.microsoft.com/de-de/library/ms173114%28v=vs.110%29.aspx


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 11:58

Alle Antworten

  • Hallo,

    du musst den ausführenden Code in eine Methode packen:

        class SampReal
        {
            public static void DonwloadFile()
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient ();
                client.DownloadFile("http://www.contoso.com/library/homepage/images/ms-banner.gif","ms-banner.gif");
             }
        }
    Dann musst du die Methode nurnoch aufrufen:
    SamplReal.DownloadFile();
    Ich habe die Methode statisch gemacht, damit du keine Instanz der Klasse brauchst.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 11:30
  • Hallo,

    du musst den ausführenden Code in eine Methode packen:

        class SampReal
        {
            public static void DonwloadFile()
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient ();
                client.DownloadFile("http://www.contoso.com/library/homepage/images/ms-banner.gif","ms-banner.gif");
             }
        }
    Dann musst du die Methode nurnoch aufrufen:
    SamplReal.DownloadFile();
    Ich habe die Methode statisch gemacht, damit du keine Instanz der Klasse brauchst.

    Und wo muss ich dass dan aufrufen?

    Meine .cs Datei

    using System;
    using System.Net;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Reflection;
    
    
    
    namespace SampReal
    {
        class SampReal
        {
        SampReal.DownloadFile();
    
        }
    }
    
        class SampReal
        {
            public static void DonwloadFile()
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient ();
                client.DownloadFile("http://www.contoso.com/library/homepage/images/ms-banner.gif","ms-banner.gif");
             }
        }

    Doch das geht so leider nicht

    Ich bekomme dann diese Fehler:

    Fehler    2    Der Typname "DownloadFile" ist im Typ "SampReal.SampReal" nicht vorhanden.    C:\Users\hallo1\documents\visual studio 2010\Projects\SampReal\SampReal\SampReal.cs    15    14    SampReal

    Fehler    1    Ungültiges Token "(" in Klasse, Struktur oder Schnittstellenmemberdeklaration.    C:\Users\hallo1\documents\visual studio 2010\Projects\SampReal\SampReal\SampReal.cs    15    26    SampReal


    Freitag, 10. Mai 2013 11:39
  • Die DLL muss eine Klasse besitzen. Der Code in der CS-Datei lautet:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SampReal
    {
        public class SampReal
        {
            public static void DonwloadFile()
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient();
                client.DownloadFile("http://www.contoso.com/library/homepage/images/ms-banner.gif", "ms-banner.gif");
            }
        }
    }
    

    Dann der Aufruf in der EXE:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication231
    {
        class Program
        {
            static void Main(string[] args)
            {
                SampReal.SampReal.DonwloadFile();
            }
        }
    }
    

    Gucke dir mal die Grundlagen zu Methoden usw. an.

    http://msdn.microsoft.com/de-de/library/ms173114%28v=vs.110%29.aspx


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 11:58
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SampReal
    {
        public class main
        {
                static void Main(string[] args)
                {
                    SampReal.DonwloadFile();
                }
        }
    }
    

    using System;
    using System.Net;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Reflection;
    
    
    namespace SampReal
    {
    
        class SampReal
        {
            public static void DonwloadFile()
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient();
                client.DownloadFile("http://wor.samp4you.com/Arendium/Test.zip", "C:/Users/hallo1/Desktop/Spiele/GTA SAMP/SAREAL/asd.zip");
            }
        }
    
    }
    

    Habe es mir angesehen, Danke

    Noch ein kleines Problem:

    Es ist eig. eine DLL wenn ich es so in eine Form Anwendung kopiere klappt alles

    doch wenn ich es als DLL mache nicht ich dachte mir ich erstelle einfach eine Datei namens main.cs

    Mit dem Inhalt, denn du vorgeschlagen hast, doch es geschieht nichts wie mache ich das dann?


    Freitag, 10. Mai 2013 12:36
  • Hast du in der Forms-Anwendung auch einen Verweis auf die DLL gesetzt?
    Rechtsklick auf Verweiuse im Projektmappenexplorer > Verweis hinzufügen... > Projektmappe > Deine DLL anhaken.

    Ansonsten sollte alles Passen.

    Hier nochmal die gesamte Projektmappe: http://sdrv.ms/16lVC3s


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 12:56
  • Hast du in der Forms-Anwendung auch einen Verweis auf die DLL gesetzt?
    Rechtsklick auf Verweiuse im Projektmappenexplorer > Verweis hinzufügen... > Projektmappe > Deine DLL anhaken.

    Ansonsten sollte alles Passen.

    Hier nochmal die gesamte Projektmappe: http://sdrv.ms/16lVC3s


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Ich will die DLL garnicht in einer Form Anwendung benutzen sondern in einem Spiel mit

    Asi Loader(asi = unbenannte DLL)

    Freitag, 10. Mai 2013 18:34
  • Ich habe 0 Ahnung was du genau vorhast.. Was genau ist "Asi Loader"?

    Nach deinen Anforderungen, die du geschrieben hast, läuft alles. Hast du das Spiel selbst geschrieben?

    Ja: dann sollte alles gehen

    Nein: Brauchst du ein Interface in deiner Klasse? Kannst du überhaupt .NET Assemblies dafür verwenden? Welches Spiel ist es? Version? Hast du mal ein Beispiel dazu angesehen? Gibt der Hersteller irgendwelche Infos, API's, ... heraus?
    Es ist kompliziert? Ja, dir scheint nämlich etwas das Basiswissen zu fehlen...

    Ggf. kannst du auch mal deine Projektmappe hochladen.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 19:06
  • Ich habe 0 Ahnung was du genau vorhast.. Was genau ist "Asi Loader"?

    Nach deinen Anforderungen, die du geschrieben hast, läuft alles. Hast du das Spiel selbst geschrieben?

    Ja: dann sollte alles gehen

    Nein: Brauchst du ein Interface in deiner Klasse? Kannst du überhaupt .NET Assemblies dafür verwenden? Welches Spiel ist es? Version? Hast du mal ein Beispiel dazu angesehen? Gibt der Hersteller irgendwelche Infos, API's, ... heraus?
    Es ist kompliziert? Ja, dir scheint nämlich etwas das Basiswissen zu fehlen...

    Ggf. kannst du auch mal deine Projektmappe hochladen.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Ich will eigendlich nichtmehr außer das diese Aktion direkt beim Laden

    der DLL ausgeführt wird.

    Freitag, 10. Mai 2013 19:18
  • Das geht nicht! Eine Methode in der DLL braucht einen Aufrufer, der das ausführen veranlässt. Für Plugins usw. nutzt man in .NET normalerweise Interfaces und Reflection, aber das nützt dir hier wahrscheinlich auch nichts.

    In C++ o.ä. ginge es vielleicht, aber davon habe ich keine Ahnung.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 19:22
  • Das geht nicht! Eine Methode in der DLL braucht einen Aufrufer, der das ausführen veranlässt. Für Plugins usw. nutzt man in .NET normalerweise Interfaces und Reflection, aber das nützt dir hier wahrscheinlich auch nichts.

    In C++ o.ä. ginge es vielleicht, aber davon habe ich keine Ahnung.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Ich habe hier im Englischen berreich gesehen, dass ich es als Exe anwendung erstellen muss damit ich einen richtigen Main Bereich habe und dann in eine .dll Umbenennen stimmt das?

    Edit: Link: http://bytes.com/topic/c-sharp/answers/493040-dll-main-entry-point

    • Bearbeitet Arendium Freitag, 10. Mai 2013 19:26
    Freitag, 10. Mai 2013 19:25
  • Naja, wenn das mir immernoch unbekannte Spiel so ein seltsammes System anwendet, dann ja.

    Du scheinst nichtmal ansatzweiße zu wissen was du machen musst...DLL, EXE, sind zwar beides Assemblies haben aber vom kompilieren her fast nichts wichtiges gemeinsam.

    Ich würde jetzt einfach sagen, erstelle eine Konsole, kopiere deine 3 Zeilen in main und kompiliere. Fertig. Aber ich kann dir fast garantieren, das es nicht so wenig sein wird.

    Aber du sagst ja auch nichts über dein Programm. Ich weiß nicht mehr wie ich weiter helfen soll...


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 19:34
  • Naja, wenn das mir immernoch unbekannte Spiel so ein seltsammes System anwendet, dann ja.

    Du scheinst nichtmal ansatzweiße zu wissen was du machen musst...DLL, EXE, sind zwar beides Assemblies haben aber vom kompilieren her fast nichts wichtiges gemeinsam.

    Ich würde jetzt einfach sagen, erstelle eine Konsole, kopiere deine 3 Zeilen in main und kompiliere. Fertig. Aber ich kann dir fast garantieren, das es nicht so wenig sein wird.

    Aber du sagst ja auch nichts über dein Programm. Ich weiß nicht mehr wie ich weiter helfen soll...


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Das Spiel heißt GTA San Andreas

    Ich habe mir ein Asi Loader addon Runtergeladen(Asi Loader lädt alle Asi dateien im Ordner Asi dateien sind eig. DLL dateien deren endung zu asi unbenannt wurde)

    Und dort will ich da die DLL bzw. asi Ja automatisch geladen wird ein Auto Updater für ein paar Dateien machen

    Freitag, 10. Mai 2013 19:36
  • 2 minuten Google:

    http://www.gtaforums.com/index.php?s=ca3c88393aea2d628a3596313b4faaa1&showtopic=517994

    Dort wird unter anderem erwähnt, das es mit C# so gut wie nicht möglich ist. Weil es keine DllMain-Methode gibt. Du brauchst also C++. Nun ein kleiner Vorschlag dazu.

    Deine 3 Codezeilen downloaden nur eine Datei. Diese Codezeilen packst du in eine C# Konsolenanwendung:

    using System.IO;
    using System.Net;
    using System.Reflection;
    
    namespace ConsoleApplication232
    {
        class Program
        {
            static void Main(string[] args)
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient();
                client.DownloadFile("http://wor.samp4you.com/Arendium/Test.zip", "C:/Users/hallo1/Desktop/Spiele/GTA SAMP/SAREAL/asd.zip");       
            }
        }
    }
    

    Dann erstellst du eine C++ DLL, keine Ahnung wie das genau geht. Dann der Code aus dem genannten Forum:

    #include <Windows.h>
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                          DWORD  ul_reason_for_call,
                          LPVOID lpReserved
         )
    {
    switch (ul_reason_for_call)
    {
    
     case DLL_PROCESS_ATTACH:
      MessageBoxA(NULL, "HAI WORLD!", "Attach", NULL);
      break;
    
     case DLL_PROCESS_DETACH:
       MessageBoxA(NULL, "THX, BYE", "Detach", NULL);
       break;
    
     case DLL_THREAD_ATTACH:
     case DLL_THREAD_DETACH:
      break;
    }
    return TRUE;
    }

    In dem DLL_PROCESS_ATTACH-Caseblock kannst du dann die C#-Anwendung starten:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687393.aspx

    Ich kann aber nicht garantieren das es mit dieser Funktion geht. (C++-Forum!)


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 19:46
  • 2 minuten Google:

    http://www.gtaforums.com/index.php?s=ca3c88393aea2d628a3596313b4faaa1&showtopic=517994

    Dort wird unter anderem erwähnt, das es mit C# so gut wie nicht möglich ist. Weil es keine DllMain-Methode gibt. Du brauchst also C++. Nun ein kleiner Vorschlag dazu.

    Deine 3 Codezeilen downloaden nur eine Datei. Diese Codezeilen packst du in eine C# Konsolenanwendung:

    using System.IO;
    using System.Net;
    using System.Reflection;
    
    namespace ConsoleApplication232
    {
        class Program
        {
            static void Main(string[] args)
            {
                string Pfad = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                WebClient client = new WebClient();
                client.DownloadFile("http://wor.samp4you.com/Arendium/Test.zip", "C:/Users/hallo1/Desktop/Spiele/GTA SAMP/SAREAL/asd.zip");       
            }
        }
    }

    Dann erstellst du eine C++ DLL, keine Ahnung wie das genau geht. Dann der Code aus dem genannten Forum:

    #include <Windows.h>
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                          DWORD  ul_reason_for_call,
                          LPVOID lpReserved
         )
    {
    switch (ul_reason_for_call)
    {
    
     case DLL_PROCESS_ATTACH:
      MessageBoxA(NULL, "HAI WORLD!", "Attach", NULL);
      break;
    
     case DLL_PROCESS_DETACH:
       MessageBoxA(NULL, "THX, BYE", "Detach", NULL);
       break;
    
     case DLL_THREAD_ATTACH:
     case DLL_THREAD_DETACH:
      break;
    }
    return TRUE;
    }

    In dem DLL_PROCESS_ATTACH-Caseblock kannst du dann die C#-Anwendung starten:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687393.aspx

    Ich kann aber nicht garantieren das es mit dieser Funktion geht. (C++-Forum!)


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Ich kann ja in das Spiel selbst nur von der DLL aus eingreifen und dinge wie memory Adressen etc. ändern, doch in meiner DLL wird der Main berreich nicht ausgeführt lasse ich es testweise zu einer windows Anwendung compilen so geht das ganze auch das einzige was ich bräuchte ist ein main/entry point
    Freitag, 10. Mai 2013 19:59
  • Nochmal langsam. Du hast 2 Projekte:

    • C++ DLL, Win32
    • C# Konsolenanwendung

    Die DLL hat einen EntryPoint Namens DllMain. Diese wird beim laden aufgerufen. Dort musst du dann im besagten case-Block die EXE starten.

    In der EXE fürst du deine 3 Zeilen Code aus, in der main-Methode.

    Jetzt kompilierst du beides, benennst die DLL um und kopierst es entsprechend deinen Pfaden.

    Wo ist da das Problem?


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Freitag, 10. Mai 2013 20:57
  • Nochmal langsam. Du hast 2 Projekte:

    • C++ DLL, Win32
    • C# Konsolenanwendung

    Die DLL hat einen EntryPoint Namens DllMain. Diese wird beim laden aufgerufen. Dort musst du dann im besagten case-Block die EXE starten.

    In der EXE fürst du deine 3 Zeilen Code aus, in der main-Methode.

    Jetzt kompilierst du beides, benennst die DLL um und kopierst es entsprechend deinen Pfaden.

    Wo ist da das Problem?


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Das es nicht funktionieren will ich lad dir mal eben das Projekt hoch

    Hier: https://skydrive.live.com/?cid=38F643D7C343A40B&id=38F643D7C343A40B%21105

    Ich will nun aber das sobald irgendein Programm etc. das ich nicht selbst erstellt habe die DLL lädt

    Automatisch von der DLL die Download Funktion ausgeführt wird.

    Freitag, 10. Mai 2013 21:17
  • Hallo Arendium,

    habt ihr eine Lösung gefunden?

    Gruß
    Marcel

    Mittwoch, 29. Mai 2013 10:54
  • Hallo Arendium,

    ich gehe davon aus, dass dir die Antworten in diesem Thread weitergeholfen haben.

    Gruß
    Marcel

    Donnerstag, 6. Juni 2013 05:10