Hirdetés

Új hozzászólás Aktív témák

  • joysefke
    veterán

    Sziasztok!

    ha egy konfigurációs értékben van hiba(nem alakítható a megfelelő formátumúra) milyen exception-nel térnétek vissza?

    FormatException? esetleg az alkalmazás definiálhatja a saját típusait...

  • DrojDtroll
    veterán

    Sziasztok!

    ha egy konfigurációs értékben van hiba(nem alakítható a megfelelő formátumúra) milyen exception-nel térnétek vissza?

  • dqdb
    nagyúr

    Úgy jön ki, ahogy a táblában van.

    var date1 = DateTime.ParseExact("2020-11-26", "yyyy-MM-dd", CultureInfo.InvariantCulture);

    Érdemes még a negyedik paraméterként átadni egy DateTimeStyles értéket is, amiben jelzed, hogy UTC-ről vagy helyi időről van szó.

  • alratar
    addikt

    A konkrét adatot kellene megnézni, mert az, hogy stringre mappelődik a dátum az SQLite adatbázisban, sajnos még semmit sem mond a string valós formátumáról.

    Úgy jön ki, ahogy a táblában van.

  • martonx
    veterán

    Sziasztok,
    Kezdő programozóként az alábbi problémába ütköztem és nem tudok továbblépni. Visual Studio 2019-et használok, és Form-ot kellene MySql adatbázissal összekötnöm, de az Entity Framework kifog rajtam.
    Megvan a Data Connection localhoston keresztül, kapcsolat aktív, táblákat Server Explorerben látom.
    Természetesen a MySql for Visual Studio (1.2.9 ver) és a MySql Connector Net (8.0.21 ver) telepítve lett. Jelenleg ezt a párosítást javasolták, ami együtt működik.
    A MySql Application Configuration-ban kijelöltem, hogy a MySql-t használom és az Entity Framework 6.x verzióval szerertném.
    A Models mappában hozzá kívántam volna adni egy új ADO.NET Entity Data Model-t, de az Entity Framework verziónál nem a 6-os, hanem az 5.X aktív, a 6.x nem is választható. Így természetesen nem is tudom folytatni a projektet. Itt akadok meg.
    Próbálgattam nyomozni, hogy mi lehet a baj, de nem sok eredménnyel. Próbáltam a MySql for Visual Studio és a MySql Connector Net újratelepítését, nem segített.
    Próbáltam új (szűz projektben) csak ez ADO.NET Data Model-t létrehozni, de nem sikerült.
    Azt is próbáltam, hogy az App.Config tartalmát ürítem ki egy szűz projjekt App.Configéval és újra építeni az elejétől a kapcsolatokat ez sem segített.
    Végső elkeseredésemben a VS -t is újratelepítettem és láss csodát az első indulásnál tök jó volt minden. Jó akkor kezdem a projektet... gondoltam magamban és töröltem a próbát, majd új projekt és minden kezdődött előröl. Nem tudom már mit kellene tennem, hogy folytatni tudjam a programot. Ha tudtok kérlek segítsetek. Köszi.

    Ezer éve preóbálkoztam utoljára winforms és classic EF-el.
    Azt javaslom, próbáld meg esetleg .Net Core-al. PomeloFoundation/Pomelo.EntityFrameworkCore.MySql: Entity Framework Core provider for MySQL and MariaDB built on top of MySqlConnector (github.com)

  • sztanozs
    veterán

    A konkrét adatot kellene megnézni, mert az, hogy stringre mappelődik a dátum az SQLite adatbázisban, sajnos még semmit sem mond a string valós formátumáról.

    (bocsi nem neked, neki ment volna)

    TL;DR
    SQLite-ban nincs DateTime típus, ki kell iratni simán stringbe és meg kell néz ki, hogyan néz ki, mert lehet kézzel rakták be, nem a megfelelő datetime funkciókkal.

    Bővebben az SQLite doksiból:
    2.2. Date and Time Datatype
    SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

    TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
    REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
    INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.

  • dqdb
    nagyúr

    A konkrét adatot kellene megnézni, mert az, hogy stringre mappelődik a dátum az SQLite adatbázisban, sajnos még semmit sem mond a string valós formátumáról.

  • Keem1
    veterán

    Sziasztok,
    Kezdő programozóként az alábbi problémába ütköztem és nem tudok továbblépni. Visual Studio 2019-et használok, és Form-ot kellene MySql adatbázissal összekötnöm, de az Entity Framework kifog rajtam.
    Megvan a Data Connection localhoston keresztül, kapcsolat aktív, táblákat Server Explorerben látom.
    Természetesen a MySql for Visual Studio (1.2.9 ver) és a MySql Connector Net (8.0.21 ver) telepítve lett. Jelenleg ezt a párosítást javasolták, ami együtt működik.
    A MySql Application Configuration-ban kijelöltem, hogy a MySql-t használom és az Entity Framework 6.x verzióval szerertném.
    A Models mappában hozzá kívántam volna adni egy új ADO.NET Entity Data Model-t, de az Entity Framework verziónál nem a 6-os, hanem az 5.X aktív, a 6.x nem is választható. Így természetesen nem is tudom folytatni a projektet. Itt akadok meg.
    Próbálgattam nyomozni, hogy mi lehet a baj, de nem sok eredménnyel. Próbáltam a MySql for Visual Studio és a MySql Connector Net újratelepítését, nem segített.
    Próbáltam új (szűz projektben) csak ez ADO.NET Data Model-t létrehozni, de nem sikerült.
    Azt is próbáltam, hogy az App.Config tartalmát ürítem ki egy szűz projjekt App.Configéval és újra építeni az elejétől a kapcsolatokat ez sem segített.
    Végső elkeseredésemben a VS -t is újratelepítettem és láss csodát az első indulásnál tök jó volt minden. Jó akkor kezdem a projektet... gondoltam magamban és töröltem a próbát, majd új projekt és minden kezdődött előröl. Nem tudom már mit kellene tennem, hogy folytatni tudjam a programot. Ha tudtok kérlek segítsetek. Köszi.

    Kifutottam a szerkesztési időből, de ez kipróbálva, 100% működik. Lehet ezt még variálni, van hozzá helper (amivel akár még egyszerűbb), de ez egy teljesen alap és tutira működő megoldás, akár GUI-s, akár console-os appról legyen szó.

    Azt azért hozzáteszem, hogy form-os app esetén biztos van szebb, elegánsabb, jobb megoldás, de én console és webappot használok, formra nincs szükségem.

    string connstr = "Server=yourmysqlserver;Port=3306;Database=yourdatabase;Uid=yourmysqluser;Pwd=yourmysqlpass";
    using (MySqlConnection conn = new MySqlConnection(connstr))
    {
            conn.Open();
            using (MySqlCommand cmd = new MySqlCommand("SHOW TABLES;", conn))
            {
                    MySqlDataReader reader = cmd.ExecuteReader();
                    DataTable dt = new DataTable();
                    dt.Load(reader);
                    
                    // Ha van DataGrid a window-n (mert nem console app), akkor még:
                    dataGridView1.DataSource = dt;
            }
            conn.Close();
    }

  • Keem1
    veterán

    Sziasztok,
    Kezdő programozóként az alábbi problémába ütköztem és nem tudok továbblépni. Visual Studio 2019-et használok, és Form-ot kellene MySql adatbázissal összekötnöm, de az Entity Framework kifog rajtam.
    Megvan a Data Connection localhoston keresztül, kapcsolat aktív, táblákat Server Explorerben látom.
    Természetesen a MySql for Visual Studio (1.2.9 ver) és a MySql Connector Net (8.0.21 ver) telepítve lett. Jelenleg ezt a párosítást javasolták, ami együtt működik.
    A MySql Application Configuration-ban kijelöltem, hogy a MySql-t használom és az Entity Framework 6.x verzióval szerertném.
    A Models mappában hozzá kívántam volna adni egy új ADO.NET Entity Data Model-t, de az Entity Framework verziónál nem a 6-os, hanem az 5.X aktív, a 6.x nem is választható. Így természetesen nem is tudom folytatni a projektet. Itt akadok meg.
    Próbálgattam nyomozni, hogy mi lehet a baj, de nem sok eredménnyel. Próbáltam a MySql for Visual Studio és a MySql Connector Net újratelepítését, nem segített.
    Próbáltam új (szűz projektben) csak ez ADO.NET Data Model-t létrehozni, de nem sikerült.
    Azt is próbáltam, hogy az App.Config tartalmát ürítem ki egy szűz projjekt App.Configéval és újra építeni az elejétől a kapcsolatokat ez sem segített.
    Végső elkeseredésemben a VS -t is újratelepítettem és láss csodát az első indulásnál tök jó volt minden. Jó akkor kezdem a projektet... gondoltam magamban és töröltem a próbát, majd új projekt és minden kezdődött előröl. Nem tudom már mit kellene tennem, hogy folytatni tudjam a programot. Ha tudtok kérlek segítsetek. Köszi.

    Mondjuk ilyen csilivili megoldással sose próbálkoztam, de működő MySQL megoldásban tudok segíteni ;)

  • Sziasztok,
    Kezdő programozóként az alábbi problémába ütköztem és nem tudok továbblépni. Visual Studio 2019-et használok, és Form-ot kellene MySql adatbázissal összekötnöm, de az Entity Framework kifog rajtam.
    Megvan a Data Connection localhoston keresztül, kapcsolat aktív, táblákat Server Explorerben látom.
    Természetesen a MySql for Visual Studio (1.2.9 ver) és a MySql Connector Net (8.0.21 ver) telepítve lett. Jelenleg ezt a párosítást javasolták, ami együtt működik.
    A MySql Application Configuration-ban kijelöltem, hogy a MySql-t használom és az Entity Framework 6.x verzióval szerertném.
    A Models mappában hozzá kívántam volna adni egy új ADO.NET Entity Data Model-t, de az Entity Framework verziónál nem a 6-os, hanem az 5.X aktív, a 6.x nem is választható. Így természetesen nem is tudom folytatni a projektet. Itt akadok meg.
    Próbálgattam nyomozni, hogy mi lehet a baj, de nem sok eredménnyel. Próbáltam a MySql for Visual Studio és a MySql Connector Net újratelepítését, nem segített.
    Próbáltam új (szűz projektben) csak ez ADO.NET Data Model-t létrehozni, de nem sikerült.
    Azt is próbáltam, hogy az App.Config tartalmát ürítem ki egy szűz projjekt App.Configéval és újra építeni az elejétől a kapcsolatokat ez sem segített.
    Végső elkeseredésemben a VS -t is újratelepítettem és láss csodát az első indulásnál tök jó volt minden. Jó akkor kezdem a projektet... gondoltam magamban és töröltem a próbát, majd új projekt és minden kezdődött előröl. Nem tudom már mit kellene tennem, hogy folytatni tudjam a programot. Ha tudtok kérlek segítsetek. Köszi.

  • alratar
    addikt

    SQLite-ban nincsen natív dátumtípus, így először azt kellene megnézni, hogy milyen típusú és tartalmú adat van a readerben.

    String.

  • dqdb
    nagyúr

    Sziasztok,
    SQLite-ból próbálok adatokat kiolvasni, de a FormatException: A karakterlánc nem értelmezhető érvényes DateTime értékként. hibát kapom.
    A következtet átalakításokkal próbálkoztam:
    Convert.ToDateTime(reader["Date"]),
    DateTime.ParseExact(reader["Date"].ToString(), "yyyy-mm-dd", null),

    Tudtok segíteni?

    SQLite-ban nincsen natív dátumtípus, így először azt kellene megnézni, hogy milyen típusú és tartalmú adat van a readerben.

  • joysefke
    veterán

    Sziasztok,
    SQLite-ból próbálok adatokat kiolvasni, de a FormatException: A karakterlánc nem értelmezhető érvényes DateTime értékként. hibát kapom.
    A következtet átalakításokkal próbálkoztam:
    Convert.ToDateTime(reader["Date"]),
    DateTime.ParseExact(reader["Date"].ToString(), "yyyy-mm-dd", null),

    Tudtok segíteni?

    Mivel úgy tűnik, hogy a DateTime parsolással van a hiba, ezért meg kéne nézni hogy
    1.
    az SqlReaderből ki jön-e egyáltalán a rekord "Date" oszlophoz tartozó értéke, ha igen akkor

    2.
    Megfelelő (az általad megadottal kompatibilis) formátumban jön-e ki

    3.
    Megnézni, hogy a format string amit megadtál egyáltalán érvényes-e. Tippre nem: Custom date and time format strings | Microsoft Docs
    A hónap az nagy 'M' a perc az kis 'm'

    4,
    Amíg az egész nem működik addig külön-külön kéne a db-ből olvasást aztán annak parsolását tesztelni.

    Legjobb lenne erre valami wrapper...

  • alratar
    addikt

    Sziasztok,
    SQLite-ból próbálok adatokat kiolvasni, de a FormatException: A karakterlánc nem értelmezhető érvényes DateTime értékként. hibát kapom.
    A következtet átalakításokkal próbálkoztam:
    Convert.ToDateTime(reader["Date"]),
    DateTime.ParseExact(reader["Date"].ToString(), "yyyy-mm-dd", null),

    Tudtok segíteni?

  • Dawide@axele
    aktív tag

    Megírni senki nem fogja itt helyetted. Ha teszel fel értelmes kérdést, akkor segítünk.

    Nem az a cél hogy más írja meg! Én szeretném megírni!De köszönöm a többieknek az építő kritikát.Lassan kész vagyok vele.Köszönöm a segítséget!

  • tboy93
    nagyúr

    Sziasztok!
    Segítségre lenne szükségem.Egyetemi beadandót kell írnom viszont nem vagyok valami jó programozásból.Ehhez kellene a segítség: A feladat készíteni egy REST API-t ( PHP-ban csináltam és JSON-al dolgozom, MySQL adatbázissal).
    Emellé egy WCF alkalmazás ami a REST API-n keresztül szerzi be az adatokat, ehhez pedig egy WPF / WInForm klienst kell csinálni.Be kell jelentkezni server oldalon és ott kell tárolni az adatokat is. A REST APi meg van és működik de a többi feldja a leckét.

    Megírni senki nem fogja itt helyetted. Ha teszel fel értelmes kérdést, akkor segítünk.

  • martonx
    veterán

    Sziasztok!
    Segítségre lenne szükségem.Egyetemi beadandót kell írnom viszont nem vagyok valami jó programozásból.Ehhez kellene a segítség: A feladat készíteni egy REST API-t ( PHP-ban csináltam és JSON-al dolgozom, MySQL adatbázissal).
    Emellé egy WCF alkalmazás ami a REST API-n keresztül szerzi be az adatokat, ehhez pedig egy WPF / WInForm klienst kell csinálni.Be kell jelentkezni server oldalon és ott kell tárolni az adatokat is. A REST APi meg van és működik de a többi feldja a leckét.

    Segítek Visual Studio és C# fog hozzá kelleni :D némi guglizást is javaslok a témában.

  • Sziasztok!
    Segítségre lenne szükségem.Egyetemi beadandót kell írnom viszont nem vagyok valami jó programozásból.Ehhez kellene a segítség: A feladat készíteni egy REST API-t ( PHP-ban csináltam és JSON-al dolgozom, MySQL adatbázissal).
    Emellé egy WCF alkalmazás ami a REST API-n keresztül szerzi be az adatokat, ehhez pedig egy WPF / WInForm klienst kell csinálni.Be kell jelentkezni server oldalon és ott kell tárolni az adatokat is. A REST APi meg van és működik de a többi feldja a leckét.

    Az ugye megvan, hogy egyetlen kérdőmondát nem volt a hozzászólásodban?
    Írd le pontosan hol akadtál el, mi nem működik, plusz a hozzá tartozó kódrészletet.

  • Dawide@axele
    aktív tag

    Sziasztok!
    Segítségre lenne szükségem.Egyetemi beadandót kell írnom viszont nem vagyok valami jó programozásból.Ehhez kellene a segítség: A feladat készíteni egy REST API-t ( PHP-ban csináltam és JSON-al dolgozom, MySQL adatbázissal).
    Emellé egy WCF alkalmazás ami a REST API-n keresztül szerzi be az adatokat, ehhez pedig egy WPF / WInForm klienst kell csinálni.Be kell jelentkezni server oldalon és ott kell tárolni az adatokat is. A REST APi meg van és működik de a többi feldja a leckét.

  • bandi0000
    nagyúr

    és mondták, hogy szeretik cserélgetni az embereket 2-3 hetente a projekteken,

    És akkor 1 hét alatt tanulnak be az emberek a projektbe?

    Jó kérdés, elég sok idő 1-1 projektet àtlàtni, nem úgy, hogy mêg a nyelv sajàtossàgai is ismeretlenek

  • joysefke
    veterán

    Jó, hàt el kellene dönteni a cégeknél is, hogy mi a fontos, suliknál eltér, valahol 3 félêven át is tollnak 1 nyelvet, míg máshol, minden félêvben más nyelv, itt nyilván mindig az alapoktól megy a tanítás...Én is voltam nem 1 cégnél interjún, kérdezték, hogy milyen nyelvek mennek, akkor pont a c# és angular typescript ment nálam, és mondták, hogy szeretik cserélgetni az embereket 2-3 hetente a projekteken, a hirdetêsben is vagy 5-6 nyelv volt felsorolva ,és mindenhez is kellett vna érteni

    és mondták, hogy szeretik cserélgetni az embereket 2-3 hetente a projekteken,

    És akkor 1 hét alatt tanulnak be az emberek a projektbe?

  • bandi0000
    nagyúr

    Ezért is annyira “kelendők” a frissen végzett programozók :D

    Jó, hàt el kellene dönteni a cégeknél is, hogy mi a fontos, suliknál eltér, valahol 3 félêven át is tollnak 1 nyelvet, míg máshol, minden félêvben más nyelv, itt nyilván mindig az alapoktól megy a tanítás...Én is voltam nem 1 cégnél interjún, kérdezték, hogy milyen nyelvek mennek, akkor pont a c# és angular typescript ment nálam, és mondták, hogy szeretik cserélgetni az embereket 2-3 hetente a projekteken, a hirdetêsben is vagy 5-6 nyelv volt felsorolva ,és mindenhez is kellett vna érteni

  • sztanozs
    veterán

    Jogos lenne, de nem tanitjak egyetemen. Olyan hanyas kodok mennek at 5-ossel hogy sirva fakadsz.

    Ezért is annyira “kelendők” a frissen végzett programozók :D

  • tboy93
    nagyúr

    Azért az, hogy bármelyik be sem jelentkezett felhasználó megkapja a teljes identity táblát szerintem nem szabadna túlmutasson egy főiskolai beadandón.
    Még ha működik is, én úgy húznám meg az illetőt, mint a szél. Ezeknek a sz@r berögződések a javítását aranyárban mérik, amint éles kódot készít az illető egy cég számára.

    Jogos lenne, de nem tanitjak egyetemen. Olyan hanyas kodok mennek at 5-ossel hogy sirva fakadsz.

  • Keem1
    veterán

    Egyetértek, én is használok REST API-t, persze éles rendszeren, de eszembe se jutna ilyesmi. Szerveroldali az access check, ráadásul https csatorna, de emellett a kliens nem küld még plain text passwordöt sem, csak hash-t.

    És ez semmi NASA vagy bank vagy ilyenek, hanem webshop.

  • sztanozs
    veterán

    Ha meg már nagyon kötözködni akarnánk, akkor button eventbe se írunk egyedi kódot, hanem (én pl) csinálnék egy (vagy több) background osztályt, aminek egy vagy több metódusát használják az eventek (is).

    De igen, ez is már túlmutat egy programozási beadandó keretein. :DDD

    Azért az, hogy bármelyik be sem jelentkezett felhasználó megkapja a teljes identity táblát szerintem nem szabadna túlmutasson egy főiskolai beadandón.
    Még ha működik is, én úgy húznám meg az illetőt, mint a szél. Ezeknek a sz@r berögződések a javítását aranyárban mérik, amint éles kódot készít az illető egy cég számára.

  • Keem1
    veterán

    Ilyen dolgok miatt nem kell végigmenni az egész listán Erre pont jó a linq, amivel egyszerűen lekerdezhetetd, hogy a respomse.data lista elemei között van-e olyany akinek a felhasználó neve és jelszava egyezik.

    Vagy akár eleve nem kéne a szervernek leküldenie a teljes usernév/pwd táblát :)

    Ha meg már nagyon kötözködni akarnánk, akkor button eventbe se írunk egyedi kódot, hanem (én pl) csinálnék egy (vagy több) background osztályt, aminek egy vagy több metódusát használják az eventek (is).

    De igen, ez is már túlmutat egy programozási beadandó keretein. :DDD

  • joysefke
    veterán

    Háát, pl., ha MSSQL, és LINQ, akkor az pont meg tudja oldani, hogy beleszövi a where feltételbe. Persze, ha úgy kezdesz hozzá az egészhez.
    Meg még inkább, de ebbe már ne menjünk bele, egy valódi rendszerben nem így van megoldva a bejelentkezés, de egy beadandó feladatnál ez még elmegy. Ha ez volt a feladat, akkor ez volt.
    Persze, ha egy kicsit is komolyabb lenne a dolog, akkor az egyik rest requestnek annak kellene lennie, hogy jó-e a felhasználónév/jelszó. Ezt nem a kliens oldalon kell eldönteni.

    Jelen esetben is csak annyi a lényeges, hogy a response data-ban benne van-e a felhasználónév, jelszó.

    Csak így nagyon csúnyán (bocsi, telefonon nincs VS telepítve :) )
    valami ilyesmit akartam mondani.

    if (response.Data.where(x => x.username.equals(edituser.text) && x.pass.equals(editpw.text)).firstordefault != null)
    {
    ShowMessage("Helyes válasz, nyalhat :)");
    }

    erre írtam, hogy naív és gyanútlan ez a RestAPI :)
    nem hogy egy táblányi usernév-pwd párost de még egyetlen egyet sem kéne leküldjön. Ha már nála van az identity adatbázis...

  • vlevi
    nagyúr

    Ilyen dolgok miatt nem kell végigmenni az egész listán Erre pont jó a linq, amivel egyszerűen lekerdezhetetd, hogy a respomse.data lista elemei között van-e olyany akinek a felhasználó neve és jelszava egyezik.

    Vagy akár eleve nem kéne a szervernek leküldenie a teljes usernév/pwd táblát :)

    Háát, pl., ha MSSQL, és LINQ, akkor az pont meg tudja oldani, hogy beleszövi a where feltételbe. Persze, ha úgy kezdesz hozzá az egészhez.
    Meg még inkább, de ebbe már ne menjünk bele, egy valódi rendszerben nem így van megoldva a bejelentkezés, de egy beadandó feladatnál ez még elmegy. Ha ez volt a feladat, akkor ez volt.
    Persze, ha egy kicsit is komolyabb lenne a dolog, akkor az egyik rest requestnek annak kellene lennie, hogy jó-e a felhasználónév/jelszó. Ezt nem a kliens oldalon kell eldönteni.

    Jelen esetben is csak annyi a lényeges, hogy a response data-ban benne van-e a felhasználónév, jelszó.

    Csak így nagyon csúnyán (bocsi, telefonon nincs VS telepítve :) )
    valami ilyesmit akartam mondani.

    if (response.Data.where(x => x.username.equals(edituser.text) && x.pass.equals(editpw.text)).firstordefault != null)
    {
    ShowMessage("Helyes válasz, nyalhat :)");
    }

  • joysefke
    veterán

    Ilyen dolgok miatt nem kell végigmenni az egész listán. Erre pont jó a linq, amivel egyszerűen lekerdezhetetd, hogy a respomse.data lista elemei között van-e olyany akinek a felhasználó neve és jelszava egyezik.

    Ilyen dolgok miatt nem kell végigmenni az egész listán Erre pont jó a linq, amivel egyszerűen lekerdezhetetd, hogy a respomse.data lista elemei között van-e olyany akinek a felhasználó neve és jelszava egyezik.

    Vagy akár eleve nem kéne a szervernek leküldenie a teljes usernév/pwd táblát :)

  • vlevi
    nagyúr

    Sziasztok! :)

    Segítséget szeretnék kérni Tőletek. Írnom kell egy REST.API beadandó. Minden (a beadandóhoz mérten) tökéletesen működik, csak a bejelentkezést nem tudom megoldani. Annyi lenne az elképzelés, hogy ha a felhasználó a 2 Textboxba (username, pw) beírja az adatokat, akkor a kapcsolódok az adatbázishoz és egy Select utasítással lekérem az adatokat egy listába, ahol meg összehasonlítom a két adatot, és ha megegyeznek, akkor szimplán kiírja, hogy "Sikeres bejelentkezés", ha meg nem egyeznek, akkor "Sikertelen belépés".

    Én ezt eddig így próbáltam megoldani, de nem vezetett sikerre. Megnéztem debugolással is, ott a listában benne vannak az adatok, tehát az adatbázissal a kapcsolat rendben van és a 2 string is jól tárolja a TextBox értékét.
    Teljesen rossz úton járok, vagy csak valami kis dolgot rontottam el? :)

    Előre is köszi a segítséget! :R

    Ilyen dolgok miatt nem kell végigmenni az egész listán. Erre pont jó a linq, amivel egyszerűen lekerdezhetetd, hogy a respomse.data lista elemei között van-e olyany akinek a felhasználó neve és jelszava egyezik.

  • joysefke
    veterán

    Sziasztok! :)

    Segítséget szeretnék kérni Tőletek. Írnom kell egy REST.API beadandó. Minden (a beadandóhoz mérten) tökéletesen működik, csak a bejelentkezést nem tudom megoldani. Annyi lenne az elképzelés, hogy ha a felhasználó a 2 Textboxba (username, pw) beírja az adatokat, akkor a kapcsolódok az adatbázishoz és egy Select utasítással lekérem az adatokat egy listába, ahol meg összehasonlítom a két adatot, és ha megegyeznek, akkor szimplán kiírja, hogy "Sikeres bejelentkezés", ha meg nem egyeznek, akkor "Sikertelen belépés".

    Én ezt eddig így próbáltam megoldani, de nem vezetett sikerre. Megnéztem debugolással is, ott a listában benne vannak az adatok, tehát az adatbázissal a kapcsolat rendben van és a 2 string is jól tárolja a TextBox értékét.
    Teljesen rossz úton járok, vagy csak valami kis dolgot rontottam el? :)

    Előre is köszi a segítséget! :R

    Elég naív és gyanútlan ez a RestAPI :)

    de nem vezetett sikerre.
    Ez túl tág.

    Gondolom egyszerre egy felhasználó akar bejelentkezni, a WinForms applikációdnak tehát elég lenne leellenőrizni, hogy a RestAPI-tól lekért listában benne van-e a megfelelő felhasználó, illetve ha igen akkor a bevitt jelszó megegyezik a listában szereplővel.

    Jelenleg te végiglépdelsz a List<Felhasznalo>-n és minden elemére megnézed az egyezőséget és hívsz egy MessageBox.Show-t...

  • Ukeve
    tag

    Sziasztok! :)

    Segítséget szeretnék kérni Tőletek. Írnom kell egy REST.API beadandó. Minden (a beadandóhoz mérten) tökéletesen működik, csak a bejelentkezést nem tudom megoldani. Annyi lenne az elképzelés, hogy ha a felhasználó a 2 Textboxba (username, pw) beírja az adatokat, akkor a kapcsolódok az adatbázishoz és egy Select utasítással lekérem az adatokat egy listába, ahol meg összehasonlítom a két adatot, és ha megegyeznek, akkor szimplán kiírja, hogy "Sikeres bejelentkezés", ha meg nem egyeznek, akkor "Sikertelen belépés".

    Én ezt eddig így próbáltam megoldani, de nem vezetett sikerre. Megnéztem debugolással is, ott a listában benne vannak az adatok, tehát az adatbázissal a kapcsolat rendben van és a 2 string is jól tárolja a TextBox értékét.
    Teljesen rossz úton járok, vagy csak valami kis dolgot rontottam el? :)

    Előre is köszi a segítséget! :R

  • A [link] -en megtalálható a kód, ami visszaadja a szöveg méretét. A szélesség és a magasság ismeretében tudod változtatni FontSize méretét, hogy beleférjen a szélességbe.

    Köszi! Mint kiderült a "perc" label-t balra, a benne lévő szöveget jobbra, a másodpercet meg pont fordítva kell igazítani, és egyből jó lett.

  • pmonitor
    aktív tag

    Azt szerettem volna, ha felbontáshoz igazítja a betűméretet (A program maximalizálva indul).

                screenHeight = SystemParameters.PrimaryScreenHeight;
                // Kiszámolja, hogy hol van a képernyő fele
                shiftScreen = SystemParameters.PrimaryScreenWidth / 2;
                // A képernyőmagassághoz igazítja a betüméretet
                minuteLabel.FontSize = screenHeight / 1.5;
                minuteLabel.Width = shiftScreen;
                secondsLabel.FontSize = screenHeight / 1.5;
                secondsLabel.Width = shiftScreen;
                // a kettőspont picit kissebb, így jobban néz ki
                colonLabel.FontSize = screenHeight / 3;

    Egy kicsit elszámoltam magam. fHD felbontáson szépen működik,

    de kissebb felbontáson (1280x1024)túl széles(nagy) a betűméret.

    Hogyan lehet jól/másképpen skálázni?

    A [link] -en megtalálható a kód, ami visszaadja a szöveg méretét. A szélesség és a magasság ismeretében tudod változtatni FontSize méretét, hogy beleférjen a szélességbe.

  • Azt szerettem volna, ha felbontáshoz igazítja a betűméretet (A program maximalizálva indul).

                screenHeight = SystemParameters.PrimaryScreenHeight;
                // Kiszámolja, hogy hol van a képernyő fele
                shiftScreen = SystemParameters.PrimaryScreenWidth / 2;
                // A képernyőmagassághoz igazítja a betüméretet
                minuteLabel.FontSize = screenHeight / 1.5;
                minuteLabel.Width = shiftScreen;
                secondsLabel.FontSize = screenHeight / 1.5;
                secondsLabel.Width = shiftScreen;
                // a kettőspont picit kissebb, így jobban néz ki
                colonLabel.FontSize = screenHeight / 3;

    Egy kicsit elszámoltam magam. fHD felbontáson szépen működik,

    de kissebb felbontáson (1280x1024)túl széles(nagy) a betűméret.

    Hogyan lehet jól/másképpen skálázni?

  • A .ToString() metódus elfogad paraméterként formázást irányító stringet..

    Pld.
    int i =7;
    i.ToString("D2");

    Köszi! Tökéletes.

  • joysefke
    veterán

    Egy stoppert készítenék, és a perc/másodperc kijelzésre kábel-eket használok. Létezik valahol olyan beállítás ami kikényszerít, hogy a beleírt számot 2 karakteren jelenítse meg, vagy nekem kell lekezelni, hogy ha egy szám kisseb mint 10, akkor elé írok egy 0-át?
    Anno még 8bites mikwrogépeken volt a érint using, amivel kimaszkozhattam, hogyan írja ki az adatot. Létezik itt is ilyesmi?

    A .ToString() metódus elfogad paraméterként formázást irányító stringet..

    Pld.
    int i =7;
    i.ToString("D2");

  • Egy stoppert készítenék, és a perc/másodperc kijelzésre kábel-eket használok. Létezik valahol olyan beállítás ami kikényszerít, hogy a beleírt számot 2 karakteren jelenítse meg, vagy nekem kell lekezelni, hogy ha egy szám kisseb mint 10, akkor elé írok egy 0-át?
    Anno még 8bites mikwrogépeken volt a érint using, amivel kimaszkozhattam, hogyan írja ki az adatot. Létezik itt is ilyesmi?

  • Keem1
    veterán

    Srácok, ha .NET Core projectet szeretnék Linux-ARM-re publish-olni, ezt kapom:

    A probléma gyökere, ha ezt a MySQL NuGet package-et telepítem (akár úgy, hogy a kódban semmi hivatkozás nincs hozzá, még a using által sem, tehát csak szimplán telepítem hozzá).
    A hivatkozott fájlban semmi érdemi infó nincs. Ha ténylegesen használatba veszem a motyót, és nem publish-sal, hanem simán felmásolással a céleszközre teszem, akkor a dotnet program.dll paranccsal olyan szépen futtatható, hogy a MySQL is gyönyörűen megy. Tehát nem inkompatibilis, vagy bármi hasonló, mert működik, egyszerűen a publish-nál valami miatt elvérzik.

    Azért lenne jó, ha így sikerülne platform-dependent módon fordítani, mert akkor a dotnet program.dll helyett sima Linuxos paranccsal (./program) menne (és megy is, ha kiszedem a MySQL package-et). Ja, és megy az SQLite Nuget package-dzsel, meg sok más egyébbel is, csak ezzel nem.

    Hogy találhatnám ki, hogy mi a baja? :R

    Szerk: továbbmegyek, a "Portable" opción kívül semmi mással nem megy. Se win64, se win86, se linux64, semmi. Csak Portable

  • Szancsó
    aktív tag

    Sziasztok!
    Segítségre/iránymutatásra lenne szükségem videók kezelésével kapcsolatban, mert semmilyen tapasztalatom nincs velük.
    A cél az lenne, hogy egy videó állományra dinamikus tartalmat tudjak beszúrni képkockánként. Vagyis ki kellene tömöríteni, hogy az adott infót el tudjam helyezni frame-enként, majd utána visszatömöríteni.
    (Dinamikus dolog lenne, nem vízjel vagy ilyesmi - ha hasonlítani kellene akkor egy fényképező keresőjében lévő hisztogramhoz hasonlítanám. De ez csak példa nem erre kell fókuszálni.)
    VisioForge Video Edit SDK .Net -et találtam: van normálisnak űnő doksija, tudja ami nekem kell, ellenben fizetős. Lehet, hogy sima FFMpegCore is tudja, ami nekem kell, csak jobban meg kellene nézni...
    Valakinek van hasonlóra bevált dolga?

  • tboy93
    nagyúr

    Én fognám az androidos komponenseket, megnézném mit csinálnak, aztán azt, hogy ezekből mennyi érhető el Xamarin.Forms-ból cross platform megvalósítással pld https://docs.microsoft.com/hu-hu/xamarin/essentials/?WT.mc_id=docs-dotnet-xamarin

    gondolom amennyire lehet egységesíteni szeretnéd a kódbázist

    Aztán ez persze csak elmélet, nem csináltam ilyen portolást :)

    Igen, az egységesítés lenne szerintem is a jo irany, de nekem nincs dontesi jogom. A kerdes egyelore annyi, hogy cegen belul probaljuk megoldani a portot (ugy hogy nem ert ios-hoz senki) vagy keressunk alvallalkozot.

  • joysefke
    veterán

    Vannak szerintem androidos libek hasznalva, de nem lattam szemelyesen a kodot.

    Én fognám az androidos komponenseket, megnézném mit csinálnak, aztán azt, hogy ezekből mennyi érhető el Xamarin.Forms-ból cross platform megvalósítással pld https://docs.microsoft.com/hu-hu/xamarin/essentials/?WT.mc_id=docs-dotnet-xamarin

    gondolom amennyire lehet egységesíteni szeretnéd a kódbázist

    Aztán ez persze csak elmélet, nem csináltam ilyen portolást :)

  • tboy93
    nagyúr

    Ha tényleg Xamarinban van írva (és nincsenek dedikáltan androidos libek / feature-ök használva), akkor elméletileg csak egy Mac kell a fordításhoz és kész is van.

    Vannak szerintem androidos libek hasznalva, de nem lattam szemelyesen a kodot.

  • cattus
    addikt

    Sziasztok!

    Van a cégnél egy kisebb alkalmazás ami Xamarinban írodott Androidra. Mennyire macera ezt portolni IOS-re? Nem dolgozott itt még senki almás ágon, milyen becslést lehet erre adni :F

    Ha tényleg Xamarinban van írva (és nincsenek dedikáltan androidos libek / feature-ök használva), akkor elméletileg csak egy Mac kell a fordításhoz és kész is van.

  • tboy93
    nagyúr

    Sziasztok!

    Van a cégnél egy kisebb alkalmazás ami Xamarinban írodott Androidra. Mennyire macera ezt portolni IOS-re? Nem dolgozott itt még senki almás ágon, milyen becslést lehet erre adni :F

  • sztanozs
    veterán

    programot írnék SharpDevelop környezetben

    Ebben az izében? https://en.wikipedia.org/wiki/SharpDevelop#/media/File:SharpDevelop.png
    Visual Studio Community ingyen van.

    Ez a kinézet egy álom ahhoz képest, amit pl az excel VBA IDE kínál.

  • joysefke
    veterán

    Sziasztok!
    Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
    "Az "egydenever" név nem szerepel ebben a környezetben"
    illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
    Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Animacios
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,kepe;
            };
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                Deneverek[] egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = 0;
                    } else {
                        egydenever[i].kepe = 1;
                    };
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        egydenever[i].kepe=1;
                    }
                    else {
                        egydenever[i].kepe=0;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].Left>0) {
                                egydenever[i].Left-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Left<800-egydenever[i].Width) {
                                egydenever[i].Left+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].Top>0) {
                                egydenever[i].Top-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Top<600-egydenever[i].Height) {
                                egydenever[i].Top+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                    else {
                        e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                }
            }
        }
    }

    programot írnék SharpDevelop környezetben

    Ebben az izében? https://en.wikipedia.org/wiki/SharpDevelop#/media/File:SharpDevelop.png
    Visual Studio Community ingyen van.

  • disy68
    aktív tag

    Utánanézek a könyvnek, bár nekem is vannak programozással (C++ és C# is) foglalkozó köteteim, igaz, végigolvasni még egyet sem volt időm vagy türelmem. Inkább célirányosan kutatok, ha szembesülök valami problémával, mert azt már nem kell nekem elmagyarázni, hogy mi a tömb, az elágazás vagy a ciklus, hanem inkább az olyan dolgokat, amik az adott fejlesztőkörnyezet sajátosságai, mint pl. hogy C#-ban hol kell elhelyezni a globális változókat a kódban vagy hogy bizonyos deklarálásokat milyen formában kell megadni.
    Lehet, hogy velem van a hiba, hogy szájbarágósan és nem bikkfanyelven várom el a szakkönyvektől is a magyarázatokat, dehát ez van.
    Az OOP lényegét is úgy mondanám el, hogy tagolva vannak benne a dolgok, az események csak azok szükségessége esetén hajtódnak végre, és nem folyamatosan, ciklikusan figyeli a program az összes tennivalót.

    "Az OOP lényegét is úgy mondanám el, hogy tagolva vannak benne a dolgok, az események csak azok szükségessége esetén hajtódnak végre, és nem folyamatosan, ciklikusan figyeli a program az összes tennivalót."

    Hmm. Az egymondatos definíció mindig nehéz, de azért az események nem igazán tartoznak ide.

    OOP alapelvek:
    - Absztrakció
    - Polimorfizmus
    - Öröklődés
    - Egységbezárás

  • Tomi_78
    aktív tag

    Ahogy látom, nem csak C#, hanem úgy általában objektumorientált programozási alapok is csiszolásra szorulnak. Én nem vagyok tanár, és a topik témája is bőven kimerül a tanításban, de én a következőket javasolnám neked:

    - rengeteg jó forrás van (leginkább angol nyelven), mégis egy egyszerű, könnyen tanulható és magyar nyelvű könyvet javasolnék: Sipos Marianna: Programozás élesben - C# (megadja a kezdő löketet, az abszolút alapokat)
    - kezdésnek én WinForms helyett console-ban gyakorolnék, alapoznék. Ha ez flottul megy, akkor jöhet az ablakozás. Az ablakozás mindaddig várhat, míg a nyelv alapjait meg nem ismered: keywordök, objektumok, névterek, metódusok, láthatóság, öröklődés, stb.

    Tényleg csupa jó tanácsként szánom a fentieket, és elnézést, ha tévedtem, rosszul mértem fel, hogy nem csak C#-ban, de úgy alapból OO programozásban is abszolút kezdő vagy.
    Amúgy meg a C# szerintem egy szuper nyelv: egyszerű, könnyen kezelhető, de mégis sokoldalú. Főleg a rengeteg forrásanyag, tutorial, 3rd party libraryk miatt.

    Utánanézek a könyvnek, bár nekem is vannak programozással (C++ és C# is) foglalkozó köteteim, igaz, végigolvasni még egyet sem volt időm vagy türelmem. Inkább célirányosan kutatok, ha szembesülök valami problémával, mert azt már nem kell nekem elmagyarázni, hogy mi a tömb, az elágazás vagy a ciklus, hanem inkább az olyan dolgokat, amik az adott fejlesztőkörnyezet sajátosságai, mint pl. hogy C#-ban hol kell elhelyezni a globális változókat a kódban vagy hogy bizonyos deklarálásokat milyen formában kell megadni.
    Lehet, hogy velem van a hiba, hogy szájbarágósan és nem bikkfanyelven várom el a szakkönyvektől is a magyarázatokat, dehát ez van.
    Az OOP lényegét is úgy mondanám el, hogy tagolva vannak benne a dolgok, az események csak azok szükségessége esetén hajtódnak végre, és nem folyamatosan, ciklikusan figyeli a program az összes tennivalót.

  • Keem1
    veterán

    Sziasztok!
    Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
    "Az "egydenever" név nem szerepel ebben a környezetben"
    illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
    Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Animacios
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,kepe;
            };
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                Deneverek[] egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = 0;
                    } else {
                        egydenever[i].kepe = 1;
                    };
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        egydenever[i].kepe=1;
                    }
                    else {
                        egydenever[i].kepe=0;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].Left>0) {
                                egydenever[i].Left-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Left<800-egydenever[i].Width) {
                                egydenever[i].Left+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].Top>0) {
                                egydenever[i].Top-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Top<600-egydenever[i].Height) {
                                egydenever[i].Top+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                    else {
                        e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                }
            }
        }
    }

    Ahogy látom, nem csak C#, hanem úgy általában objektumorientált programozási alapok is csiszolásra szorulnak. Én nem vagyok tanár, és a topik témája is bőven kimerül a tanításban, de én a következőket javasolnám neked:

    - rengeteg jó forrás van (leginkább angol nyelven), mégis egy egyszerű, könnyen tanulható és magyar nyelvű könyvet javasolnék: Sipos Marianna: Programozás élesben - C# (megadja a kezdő löketet, az abszolút alapokat)
    - kezdésnek én WinForms helyett console-ban gyakorolnék, alapoznék. Ha ez flottul megy, akkor jöhet az ablakozás. Az ablakozás mindaddig várhat, míg a nyelv alapjait meg nem ismered: keywordök, objektumok, névterek, metódusok, láthatóság, öröklődés, stb.

    Tényleg csupa jó tanácsként szánom a fentieket, és elnézést, ha tévedtem, rosszul mértem fel, hogy nem csak C#-ban, de úgy alapból OO programozásban is abszolút kezdő vagy.
    Amúgy meg a C# szerintem egy szuper nyelv: egyszerű, könnyen kezelhető, de mégis sokoldalú. Főleg a rengeteg forrásanyag, tutorial, 3rd party libraryk miatt.

  • Tomi_78
    aktív tag

    Bocs, az előbb javítottam és láttam, hogy nem kezdőérték nélküli a Deneverek tömb... Így javítottam a programomon, de most csak egy denevér jelenik meg, az sem animálódik és nem is mozog:
    namespace Animacios
    {    
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,xhely,yhely;
                public Bitmap kepe;
            };
            
            Deneverek[] egydenever;
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = deneverkepe1;
                    } else {
                        egydenever[i].kepe = deneverkepe2;
                    };
                    egydenever[i].xhely=vsz.Next(1,800-egydenever[i].kepe.Width);
                    egydenever[i].yhely=vsz.Next(1,600-egydenever[i].kepe.Height);
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==deneverkepe1) {
                        egydenever[i].kepe=deneverkepe2;
                    }
                    else {
                        egydenever[i].kepe=deneverkepe1;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].xhely>0) {
                                egydenever[i].xhely-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].xhely<800-egydenever[i].kepe.Width) {
                                egydenever[i].xhely+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].yhely>0) {
                                egydenever[i].yhely-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].yhely<600-egydenever[i].kepe.Height) {
                                egydenever[i].yhely+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                        e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].xhely,egydenever[i].yhely,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
                }
            }
        }
    }

    Na végre, minden működik, kivéve hogy a képek villognak egy kissé. Ezt nem lehet valahogy kiküszöbölni? Az Invalidate(); függvény ennyire akadozna?

  • Tomi_78
    aktív tag

    Bocs, az előbb javítottam és láttam, hogy nem kezdőérték nélküli a Deneverek tömb... Így javítottam a programomon, de most csak egy denevér jelenik meg, az sem animálódik és nem is mozog:
    namespace Animacios
    {    
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,xhely,yhely;
                public Bitmap kepe;
            };
            
            Deneverek[] egydenever;
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = deneverkepe1;
                    } else {
                        egydenever[i].kepe = deneverkepe2;
                    };
                    egydenever[i].xhely=vsz.Next(1,800-egydenever[i].kepe.Width);
                    egydenever[i].yhely=vsz.Next(1,600-egydenever[i].kepe.Height);
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==deneverkepe1) {
                        egydenever[i].kepe=deneverkepe2;
                    }
                    else {
                        egydenever[i].kepe=deneverkepe1;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].xhely>0) {
                                egydenever[i].xhely-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].xhely<800-egydenever[i].kepe.Width) {
                                egydenever[i].xhely+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].yhely>0) {
                                egydenever[i].yhely-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].yhely<600-egydenever[i].kepe.Height) {
                                egydenever[i].yhely+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                        e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].xhely,egydenever[i].yhely,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
                }
            }
        }
    }

  • Tomi_78
    aktív tag

    Szia,

    Nem teljesen értem a kódodat, ezt valahonnan kimásoltad? A problémák amik előjöttek azért vannak, mert olyan változókat használsz amik nincsenek sehol deklarálva.
    Pl. az srcRect és units változókat miért adtad meg a DrawImage-ben, ha nincsenek is ilyenjeid?

    Az egydenever változót használod minden metódusban, pedig a konstruktorban, mint lokális változó hozod létre. Ha egy metóduson belül hozol létre egy változót, akkor az csak azon a metóduson belül fog élni, máshol nem, ezt javíthatod a kódon belül pl. így:
    Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
    Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
    Deneverek[] egydenever;

    majd később már csak ehhez rendelsz értéket:
    egydenever = new Deneverek[3];
    int svsz;

    De érdemes lenne első körben a nyelv alapjait is átnézned.

    Illetve miért pont SharpDevelop, ami évek óta discontinued állapotban van?

    Szia Alexios!

    Köszönöm a választ; ezzel egyúttal azt a kérdésemet is megválaszoltad, hogy kezdőérték nélküli, dinamikus tömböt hogyan lehet létrehozni. :K
    Még javítottam a kódomon annyit, hogy a képe egy változóba kerüljön, tehát:
    class Deneverek
            {
                public int dirx,diry;
                public Bitmap kepe;
           };                      

    (...)
    if (svsz==0) {
                        egydenever[i].kepe = deneverkepe1;
                    } else {
                        egydenever[i].kepe = deneverkepe2;
                    };

    De ezek után pl. a kirajzolásban nem ismeri fel a képhez tartozó Left és Top változókat:
    void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                        e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].kepe.Left,egydenever[i].kepe.Top,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
                }
            }

    Ez miért van?
    És hogy miért pont SharpDevelop? Martonxnek is válaszolva: már régebben a gépemen pihen letöltve és csak most vettem elő. Az tetszett benne annakidején, hogy ingyenes és kicsi: csak letöltöd, kitömöríted és használatra kész. Nem tudom, van-e még ilyen fejlesztőkörnyezet, de nekem egyelőre bejön. :K Azt viszont én is sajnálom, hogy már nem fejlesztik tovább a készítői.

  • martonx
    veterán

    Sziasztok!
    Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
    "Az "egydenever" név nem szerepel ebben a környezetben"
    illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
    Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Animacios
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,kepe;
            };
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                Deneverek[] egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = 0;
                    } else {
                        egydenever[i].kepe = 1;
                    };
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        egydenever[i].kepe=1;
                    }
                    else {
                        egydenever[i].kepe=0;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].Left>0) {
                                egydenever[i].Left-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Left<800-egydenever[i].Width) {
                                egydenever[i].Left+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].Top>0) {
                                egydenever[i].Top-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Top<600-egydenever[i].Height) {
                                egydenever[i].Top+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                    else {
                        e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                }
            }
        }
    }

    Miért SharpDevelop?

  • Alexios
    veterán

    Sziasztok!
    Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
    "Az "egydenever" név nem szerepel ebben a környezetben"
    illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
    Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Animacios
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,kepe;
            };
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                Deneverek[] egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = 0;
                    } else {
                        egydenever[i].kepe = 1;
                    };
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        egydenever[i].kepe=1;
                    }
                    else {
                        egydenever[i].kepe=0;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].Left>0) {
                                egydenever[i].Left-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Left<800-egydenever[i].Width) {
                                egydenever[i].Left+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].Top>0) {
                                egydenever[i].Top-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Top<600-egydenever[i].Height) {
                                egydenever[i].Top+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                    else {
                        e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                }
            }
        }
    }

    Szia,

    Nem teljesen értem a kódodat, ezt valahonnan kimásoltad? A problémák amik előjöttek azért vannak, mert olyan változókat használsz amik nincsenek sehol deklarálva.
    Pl. az srcRect és units változókat miért adtad meg a DrawImage-ben, ha nincsenek is ilyenjeid?

    Az egydenever változót használod minden metódusban, pedig a konstruktorban, mint lokális változó hozod létre. Ha egy metóduson belül hozol létre egy változót, akkor az csak azon a metóduson belül fog élni, máshol nem, ezt javíthatod a kódon belül pl. így:
    Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
    Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
    Deneverek[] egydenever;

    majd később már csak ehhez rendelsz értéket:
    egydenever = new Deneverek[3];
    int svsz;

    De érdemes lenne első körben a nyelv alapjait is átnézned.

    Illetve miért pont SharpDevelop, ami évek óta discontinued állapotban van?

  • Tomi_78
    aktív tag

    Sziasztok!
    Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
    "Az "egydenever" név nem szerepel ebben a környezetben"
    illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
    Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Animacios
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        
        public partial class MainForm : Form
        {    
            Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
            Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
            
            class Deneverek
            {
                public int dirx,diry,kepe;
            };
            
            public MainForm()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
                deneverkepe1.MakeTransparent();
                deneverkepe2.MakeTransparent();
                
                Deneverek[] egydenever = new Deneverek[3];
                int svsz;
                for (int i=0; i<3; i++) {
                    egydenever[i]= new Deneverek();
                    System.Random vsz = new System.Random();
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].dirx = -1;
                    } else {
                        egydenever[i].dirx = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].diry = -1;
                    } else {
                        egydenever[i].diry = 1;
                    };
                    svsz = vsz.Next(1);
                    if (svsz==0) {
                        egydenever[i].kepe = 0;
                    } else {
                        egydenever[i].kepe = 1;
                    };
                };
            }
            void AnimIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        egydenever[i].kepe=1;
                    }
                    else {
                        egydenever[i].kepe=0;
                    };
                };
            }
            void MozgIdozitoTick(object sender, EventArgs e)
            {
                for (int i=0; i<3; i++) {
                    switch (egydenever[i].dirx) {
                        case -1:
                            if (egydenever[i].Left>0) {
                                egydenever[i].Left-=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Left<800-egydenever[i].Width) {
                                egydenever[i].Left+=4;
                            }
                            else egydenever[i].dirx*=-1;
                        break;
                    };
                    switch (egydenever[i].diry) {
                        case -1:
                            if (egydenever[i].Top>0) {
                                egydenever[i].Top-=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                        case 1:
                            if (egydenever[i].Top<600-egydenever[i].Height) {
                                egydenever[i].Top+=4;
                            }
                            else egydenever[i].diry*=-1;
                        break;
                    };
                };
            }
            void MainFormPaint(object sender, PaintEventArgs e)
            {
                for (int i=0; i<3; i++) {
                    if (egydenever[i].kepe==0) {
                        e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                    else {
                        e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
                    }
                }
            }
        }
    }

  • Keem1
    veterán

    ???

    Az eredmény egy List<string> ami stringként ábrázolt IP-címeket tartalmaz, hol itt a probléma?

    Hátöö.... nem.. :D
    Nem az IP lesz stringként, hanem az object neve.

    Szerk... ja de. :U Szóval próbálkoztam, megterveztem a kérdést, majd megírtam a jó megoldást és végül azt posztoltam ide? Ez történhetett? :DDD

    Szóval megvan a megoldás, nincs kérdés, sorry! :B

  • joysefke
    veterán

    Srácok, Linq segítséget kérnék.

    Ez így az objektumot adja vissza:
    System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).Select(ip => ip.ToString()).ToList();

    Addig jó, hogy ha lehagyom a végéről a selectet, akkor ugye az eredmény List<IpAddress>, viszont nekem List<string> kellene, de nem az ojjektum nevéről :DDD :R

    ???

    Az eredmény egy List<string> ami stringként ábrázolt IP-címeket tartalmaz, hol itt a probléma?

  • Keem1
    veterán

    Srácok, Linq segítséget kérnék.

    Ez így az objektumot adja vissza:
    System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).Select(ip => ip.ToString()).ToList();

    Addig jó, hogy ha lehagyom a végéről a selectet, akkor ugye az eredmény List<IpAddress>, viszont nekem List<string> kellene, de nem az ojjektum nevéről :DDD :R

  • joysefke
    veterán

    Köszönöm a segítséget. A forráson nem tudok változtatni, ott van rossz más sorrendben az adat. A további feldolgozás a megszokott (legjobb oldalibb) indexelést használja. Az adatok későbbi feldolgozása miatt van szükség az int-ben való tárolásra.

            public static int[,] Get4mIntArrBufferedSpan(string fileName)
            {
                var sw = new Stopwatch();
                uint heigth = 2048;
                uint width = heigth;
                var result = new int[heigth, width];
                var buffSize = sizeof(ushort) * heigth;
                var buff = new byte[buffSize];
                using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 1024 * 1024))
                {
                    sw.Start();
                    for (int w = 0; w < width; w++)
                    {
                        int chunk = 0;
                        while (chunk < buffSize)
                            chunk += fs.Read(buff, chunk, (int)buffSize - chunk);
                        
                      var shortArr = MemoryMarshal.Cast<byte, ushort>(buff);
                        for (int h = 0; h < heigth; h++)
                          result[h, w] = shortArr[h];
                    }
                    sw.Stop();
                    Console.WriteLine($"{nameof(Get4mIntArrBufferedSpan)} took {sw.ElapsedMilliseconds}ms");
                }
                return result;
            }

    Nekem a fenti kód pontosan ugyanazt az eredmény tömböt dobja ki mint a te első metódusod. A különbség annyi, hogy a itt while ciklus megpróbál egyszerre 4096byteot (2048db ushort) kiolvasni a streamből, a kiolvasott byte tömböt castolja ushort-tömbre azzal pedig feltölti egy oszlopodat.

    Szóval itt is rossz a tömb bejárási sorrendje, de a Stream.Read() metódus úgy tűnik, hogy ennyivel hatékonyabb, mint egyenként ushortokat olvasgatni. (nálam pontosan duplázódott a sebesség)

    A fenti kódban ha a mátrix bejárási sorrendje "normalizálódna" akkor további 3x lenne gyorsabb. ==> tehát igen, itt a processzor fogja vissza a fájlműveletet :)

    Ebben az esetben lenne értelme egyszerre 2048db elemnél többet is olvasni. Az még dobna rajta.

  • DrojDtroll
    veterán

    for (int i = 0; i < heigth; i++)
    {
        for (int j = 0; j < width; j++)
        {
            result[j, i] = reader.ReadUInt16();
        }
    }

    Itt van még egy olyan probléma (mindkét példádban), hogy úgy iterálsz át egy nagy többdimenziós tömbön, hogy a belső ciklusod nem a tömb legjobboldalibb dimenzióján iterál.

    C#-ban a többdimenziós tömbök (A[,,,]) row-major ként vannak a memóriában, tehát a legjobb oldalibb dimenzió egymás melletti elemei a memóriában egymás mellett lesznek. az A[100, 50] elem mellett az A[100,51] elem van. Ezzel szemben az A[101,50] az teljesen máshol van, a te esetedben (2048) elemmel később mint az A[100,50], tehát mivel int tömbről van szó, 8KB-tal később van. Az hogy itt csak írsz és nem olvasol kb mindegy, mert nyilván egy egész cache line lesz írva/olvasva.

    A helyzeten cache-line szempontből még (valószínűleg) tovább ront itt, hogy kettő hatványonként iterálsz. ilyen problémák nagy mátrixok szorzásánál vannak

    Köszönöm a segítséget. A forráson nem tudok változtatni, ott van rossz más sorrendben az adat. A további feldolgozás a megszokott (legjobb oldalibb) indexelést használja. Az adatok későbbi feldolgozása miatt van szükség az int-ben való tárolásra.

  • joysefke
    veterán

    Megvan mi volt a hiba forrása: nem úgy vannak tárolva az adatok ahogy azt elképzeltem.
    Nem sorrendben vannak leírva a byte-ok hanem fordított sorrendben. Meg kell cserélni azt a két byte-ot ami a számot tárolja.

    Igen, én is észrevettem, de szvsz nem a forrásadatokkal van a probléma, hanem a két metódusod nem ugyanazt a bytesorrendet használja, tehát a tömbök tartalma amelyeket visszaadnak sem ugyanaz lesz.

    Amikor a második metódusban streamből beolvasol egy ulongot, akkor a ReadUInt64() figyelembe veszi az x86 bytesorrendjét: a változónak a kisebb helyiértékű byteja van alacsonyabb címen (little endian). Ha a streamed sorrendben ezeket a byteoket tartalmazza:
    1, 0x01; 2, 0x02; 3; 0x03; 4, 0x04; 5; 0x05; 6, 0x06; 7, 0x07;8, 0x08;

    akkor a kiolvasott ulong értéke az 0x08'07'06'05'04'03'02'01 lesz, szemben azzal a sorrenddel amit a fileban látsz.

    Ha ezt a részt fordított sorrendbe raknád, akkor pont ugyanazt a tömböt adná vissza a kettő metódusod.

                            result[++j, i] = (ushort)(r >> 48);
                            result[++j, i] = (ushort)(r >> 32);
                            result[++j, i] = (ushort)(r >> 16);
                            result[++j, i] = (ushort)r;

  • joysefke
    veterán

    Sziasztok!

    Van sok 8MB-os fájlom, amit szeretnék feldolgozni. A fájlok pontosan 2048x2048 db előjel nélküli két byte-os egész számot tartalmaznak binárisan.

    Az első megoldásban két for ciklus segítségével olvastam be 16 bitenként. Próbaként megpróbáltam 64 bitet beolvasni és biteltolással előállítani a 64 bites számból a 4db 16 biteset. Úgy néz ki ez a módszer kb. kétszer olyan gyors mint a 16 bites.

    Különböző tömböket kapok és nem tudom hol a hiba.

    Mi okozza a különbséget?

    Pastebin link

    for (int i = 0; i < heigth; i++)
    {
        for (int j = 0; j < width; j++)
        {
            result[j, i] = reader.ReadUInt16();
        }
    }

    Itt van még egy olyan probléma (mindkét példádban), hogy úgy iterálsz át egy nagy többdimenziós tömbön, hogy a belső ciklusod nem a tömb legjobboldalibb dimenzióján iterál.

    C#-ban a többdimenziós tömbök (A[,,,]) row-major ként vannak a memóriában, tehát a legjobb oldalibb dimenzió egymás melletti elemei a memóriában egymás mellett lesznek. az A[100, 50] elem mellett az A[100,51] elem van. Ezzel szemben az A[101,50] az teljesen máshol van, a te esetedben (2048) elemmel később mint az A[100,50], tehát mivel int tömbről van szó, 8KB-tal később van. Az hogy itt csak írsz és nem olvasol kb mindegy, mert nyilván egy egész cache line lesz írva/olvasva.

    A helyzeten cache-line szempontből még (valószínűleg) tovább ront itt, hogy kettő hatványonként iterálsz. ilyen problémák nagy mátrixok szorzásánál vannak

  • DrojDtroll
    veterán

    Nincs időm kipróbálni, de nekem egyáltalán nem szimpatikus egy ilyen nagy fájlnak a mini adagokban való szekvenciális olvasgatása.

    1, Miért nem a sima stream Read metódussal olvasol azonnal byte[] tömbbe?
    2, Én megpróbálnám a bufferméreteket manuálisan feljebb húzni. Alapból csak valami ici-pici bufferekkel dolgozik. (nekem pár 10KB rémlik)
    3, Nem mintha itt számítania kellene de te itt ugye 4M elemen iterálsz át egy szoros for () ciklusban => ha nem fájlműveletet végeznél, akkor már ez is bizonyos helyzetekben indokolatlanul lassú (4M tömbhatár ellenőrzés az indexerekre+ ellenőrzés az iterátoron, szerk: mondjuk 4M az még nem túl sok..)
    (4, miért int tömbben-ben tárolod a short értékeidet?)

    5, a két kód ránézésre nem ugyanazt csinálja. a második konkrétan elcseszettnek tűnik.
    64bitenként olvasol és ugyanúgy 4M-szor mint amikor 16 bitenként olvastál????

    Megvan mi volt a hiba forrása: nem úgy vannak tárolva az adatok ahogy azt elképzeltem.
    Nem sorrendben vannak leírva a byte-ok hanem fordított sorrendben. Meg kell cserélni azt a két byte-ot ami a számot tárolja.

  • joysefke
    veterán

    Nincs időm kipróbálni, de nekem egyáltalán nem szimpatikus egy ilyen nagy fájlnak a mini adagokban való szekvenciális olvasgatása.

    1, Miért nem a sima stream Read metódussal olvasol azonnal byte[] tömbbe?
    2, Én megpróbálnám a bufferméreteket manuálisan feljebb húzni. Alapból csak valami ici-pici bufferekkel dolgozik. (nekem pár 10KB rémlik)
    3, Nem mintha itt számítania kellene de te itt ugye 4M elemen iterálsz át egy szoros for () ciklusban => ha nem fájlműveletet végeznél, akkor már ez is bizonyos helyzetekben indokolatlanul lassú (4M tömbhatár ellenőrzés az indexerekre+ ellenőrzés az iterátoron, szerk: mondjuk 4M az még nem túl sok..)
    (4, miért int tömbben-ben tárolod a short értékeidet?)

    5, a két kód ránézésre nem ugyanazt csinálja. a második konkrétan elcseszettnek tűnik.
    64bitenként olvasol és ugyanúgy 4M-szor mint amikor 16 bitenként olvastál????

    Uhh az utolsó pontot visszavonom, látom, hogy a belső ciklus 4esével változik növeli a törzsön belül a ciklusváltozót. késő van na :B
    Nyilván segít neki, hogy negyed annyi io van. De igazán jo szvsz akkor lesz ha nagy puffer mellett byte tömböt olvasol be addig amíg van mit olvasni.

  • joysefke
    veterán

    Sziasztok!

    Van sok 8MB-os fájlom, amit szeretnék feldolgozni. A fájlok pontosan 2048x2048 db előjel nélküli két byte-os egész számot tartalmaznak binárisan.

    Az első megoldásban két for ciklus segítségével olvastam be 16 bitenként. Próbaként megpróbáltam 64 bitet beolvasni és biteltolással előállítani a 64 bites számból a 4db 16 biteset. Úgy néz ki ez a módszer kb. kétszer olyan gyors mint a 16 bites.

    Különböző tömböket kapok és nem tudom hol a hiba.

    Mi okozza a különbséget?

    Pastebin link

    Nincs időm kipróbálni, de nekem egyáltalán nem szimpatikus egy ilyen nagy fájlnak a mini adagokban való szekvenciális olvasgatása.

    1, Miért nem a sima stream Read metódussal olvasol azonnal byte[] tömbbe?
    2, Én megpróbálnám a bufferméreteket manuálisan feljebb húzni. Alapból csak valami ici-pici bufferekkel dolgozik. (nekem pár 10KB rémlik)
    3, Nem mintha itt számítania kellene de te itt ugye 4M elemen iterálsz át egy szoros for () ciklusban => ha nem fájlműveletet végeznél, akkor már ez is bizonyos helyzetekben indokolatlanul lassú (4M tömbhatár ellenőrzés az indexerekre+ ellenőrzés az iterátoron, szerk: mondjuk 4M az még nem túl sok..)
    (4, miért int tömbben-ben tárolod a short értékeidet?)

    5, a két kód ránézésre nem ugyanazt csinálja. a második konkrétan elcseszettnek tűnik.
    64bitenként olvasol és ugyanúgy 4M-szor mint amikor 16 bitenként olvastál????

  • DrojDtroll
    veterán

    Sziasztok!

    Van sok 8MB-os fájlom, amit szeretnék feldolgozni. A fájlok pontosan 2048x2048 db előjel nélküli két byte-os egész számot tartalmaznak binárisan.

    Az első megoldásban két for ciklus segítségével olvastam be 16 bitenként. Próbaként megpróbáltam 64 bitet beolvasni és biteltolással előállítani a 64 bites számból a 4db 16 biteset. Úgy néz ki ez a módszer kb. kétszer olyan gyors mint a 16 bites.

    Különböző tömböket kapok és nem tudom hol a hiba.

    Mi okozza a különbséget?

    Pastebin link

  • joysefke
    veterán

    Ezt meg kell osszam veletek skacok :D Nem, nem száll a fejembe a dicsőség, 25 irtó könnyű kérdés, aki ezeket nem tudja szintén 100%-osra megválaszolni, az annyit jelent, hogy még tanulja/tanulnia kell a nyelvet. De azért örülök, hogy puskázás nélkül 25/25 lett :DDD

    C# is an alias of C++. True, False? :D

  • Keem1
    veterán

    Ezt meg kell osszam veletek skacok :D Nem, nem száll a fejembe a dicsőség, 25 irtó könnyű kérdés, aki ezeket nem tudja szintén 100%-osra megválaszolni, az annyit jelent, hogy még tanulja/tanulnia kell a nyelvet. De azért örülök, hogy puskázás nélkül 25/25 lett :DDD

  • petyus_
    senior tag

    Köszönöm a válaszokat. A cél egy log fájl írása lenne. Bárhol a progiban ahol Catch ágra fut, ott meg kellene hívnom egy errorlog függvényt, aminek az első paramétere, egy int (hol száll el) ... ez tiszta. DE...
    A eset: a második paraméter meg mondjuk egy string (név) , harmadik egy int (ciklusszámláló).
    B eset: a második paraméter egy WebClient (maga az objektum), harmadik param. egy webclient response (a válasz, amit ad), negyedik egy string (URL, ahonnan meg lett az hívva).
    C eset: stb...

    Tehát a paraméterek száma is változik (gondolom optional kell legyenek az elhagyható paraméterek) és még a típusuk is változik össze vissza. A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni.

    Az átadott paramétereket meg szétbontom, formázom, és kiírom a log fájlba.

    Csak tanulás céljából kérdezem, mert túl sok macera, meg lehet kerülni, máshogy kivitelezni. (meg mert így szokták a nagyok).

    Lenne kérdésem a válaszokkal kapcsolatban is, de ha felteszem, tutti elviszi a témát. :R

    Még1x köszönöm a válaszokat, mindent átguglizok. :)

    Ahogy a többiek is írták, a logger-be nem kéne ilyen logikát rakni, annak már csak azt az adatot kellene átadnod, ami a logba kerül.

    "A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni."

    Ha mégis így akarod, akkor a params-t használd, ahogy korábban írtam:
    Method(int x, params object[] obj){}
    Itt nem kell létrehoznod semmilyen tömböt, vesszővel elválasztva pakolhatod be a paramétereket, utána a függvényen belül viszont a tömb elemein kell végigmenned.

  • joysefke
    veterán

    Köszönöm a válaszokat. A cél egy log fájl írása lenne. Bárhol a progiban ahol Catch ágra fut, ott meg kellene hívnom egy errorlog függvényt, aminek az első paramétere, egy int (hol száll el) ... ez tiszta. DE...
    A eset: a második paraméter meg mondjuk egy string (név) , harmadik egy int (ciklusszámláló).
    B eset: a második paraméter egy WebClient (maga az objektum), harmadik param. egy webclient response (a válasz, amit ad), negyedik egy string (URL, ahonnan meg lett az hívva).
    C eset: stb...

    Tehát a paraméterek száma is változik (gondolom optional kell legyenek az elhagyható paraméterek) és még a típusuk is változik össze vissza. A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni.

    Az átadott paramétereket meg szétbontom, formázom, és kiírom a log fájlba.

    Csak tanulás céljából kérdezem, mert túl sok macera, meg lehet kerülni, máshogy kivitelezni. (meg mert így szokták a nagyok).

    Lenne kérdésem a válaszokkal kapcsolatban is, de ha felteszem, tutti elviszi a témát. :R

    Még1x köszönöm a válaszokat, mindent átguglizok. :)

    Vannak loggoló frameworkok, pld "Serilog". https://github.com/serilog/serilog/wiki/Getting-Started#example-application

    Itt egy videó https://www.youtube.com/watch?v=ljZpWbuK68s

    A loggolás pedig ennyi:

    catch (Exception ex){
    Log.Error(ex, "Something went wrong. Részletek: {param1} {param2} {param3}", param1, param2, param3);             
    }

    Ha nem teljesítmény kritikus az applikáció akkor a fenti séma jó is...

    mindent átguglizok
    abból semmit nem lehet tanúlni

  • sztanozs
    veterán

    Köszönöm a válaszokat. A cél egy log fájl írása lenne. Bárhol a progiban ahol Catch ágra fut, ott meg kellene hívnom egy errorlog függvényt, aminek az első paramétere, egy int (hol száll el) ... ez tiszta. DE...
    A eset: a második paraméter meg mondjuk egy string (név) , harmadik egy int (ciklusszámláló).
    B eset: a második paraméter egy WebClient (maga az objektum), harmadik param. egy webclient response (a válasz, amit ad), negyedik egy string (URL, ahonnan meg lett az hívva).
    C eset: stb...

    Tehát a paraméterek száma is változik (gondolom optional kell legyenek az elhagyható paraméterek) és még a típusuk is változik össze vissza. A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni.

    Az átadott paramétereket meg szétbontom, formázom, és kiírom a log fájlba.

    Csak tanulás céljából kérdezem, mert túl sok macera, meg lehet kerülni, máshogy kivitelezni. (meg mert így szokták a nagyok).

    Lenne kérdésem a válaszokkal kapcsolatban is, de ha felteszem, tutti elviszi a témát. :R

    Még1x köszönöm a válaszokat, mindent átguglizok. :)

    Log fájlba az alábbi dolgok kellenek:
    - esemény ideje (UTC vagy timezone megadásával)
    - esemény szintje (amennyiben szükséges)
    - esemény típusa (és/vagy azonosítója)
    - esemény forrása (és vagy forrás azonosítója)
    - esemény sikeressége (ha típus szinten ezt nem különítjük el)
    - esemény üzenet

    Tehát egy logoló kódba nem kell beledobálni mindenféle objektumokat. Azt vagy egy előre definiált esemény-objektummal kell feltölteni, vagy szöveges mezőket megadni.

  • kiskornel
    addikt

    szvsz:
    -(A) vagy több overloadolt függvény dekalrációt használsz ugyanazzal a függvénynévvel, de különböző paramétertípusokkal , e.g.: void A (int, string, string); void A (int, object, object);
    -(B) vagy egyszerűen object-ként deklarálod a különböző bemenő paramétereket és bent egy type-matching switch statementel eldöntöd a konkrét típust.

    -(C) gondolom tisztában vagy a generikus típus/metódusdeklaráció mikéntjével és nem erre lenne igazából szükséged:
    pld
    public int Foo<T1,T2,T3>(int x, T1 p1, T2 p2, T3 p3){
               
        Console.WriteLine($"{p1.GetType()}  {p2.GetType()} {p3.GetType()}");
        return x;
    }

    Köszönöm a válaszokat. A cél egy log fájl írása lenne. Bárhol a progiban ahol Catch ágra fut, ott meg kellene hívnom egy errorlog függvényt, aminek az első paramétere, egy int (hol száll el) ... ez tiszta. DE...
    A eset: a második paraméter meg mondjuk egy string (név) , harmadik egy int (ciklusszámláló).
    B eset: a második paraméter egy WebClient (maga az objektum), harmadik param. egy webclient response (a válasz, amit ad), negyedik egy string (URL, ahonnan meg lett az hívva).
    C eset: stb...

    Tehát a paraméterek száma is változik (gondolom optional kell legyenek az elhagyható paraméterek) és még a típusuk is változik össze vissza. A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni.

    Az átadott paramétereket meg szétbontom, formázom, és kiírom a log fájlba.

    Csak tanulás céljából kérdezem, mert túl sok macera, meg lehet kerülni, máshogy kivitelezni. (meg mert így szokták a nagyok).

    Lenne kérdésem a válaszokkal kapcsolatban is, de ha felteszem, tutti elviszi a témát. :R

    Még1x köszönöm a válaszokat, mindent átguglizok. :)

  • joysefke
    veterán

    Sziasztok!
    Adott egy függvényem, aminek az első bemenő paramétere int, viszont a 2. már lehet string, int, vagy objektum... a 3. 4. 5. paraméter szintúgy különböző típusok lehetnének.

    Azt vágom, hogy kell később vizsgálni, hogy milyen típus, de hogy kell a függvény paramétereit leírni, hogy híváskor elfogadjon akár számot, akár stringet, akár objektumot?

    Előre is köszi

    szvsz:
    -(A) vagy több overloadolt függvény dekalrációt használsz ugyanazzal a függvénynévvel, de különböző paramétertípusokkal , e.g.: void A (int, string, string); void A (int, object, object);
    -(B) vagy egyszerűen object-ként deklarálod a különböző bemenő paramétereket és bent egy type-matching switch statementel eldöntöd a konkrét típust.

    -(C) gondolom tisztában vagy a generikus típus/metódusdeklaráció mikéntjével és nem erre lenne igazából szükséged:
    pld
    public int Foo<T1,T2,T3>(int x, T1 p1, T2 p2, T3 p3){
               
        Console.WriteLine($"{p1.GetType()}  {p2.GetType()} {p3.GetType()}");
        return x;
    }

  • petyus_
    senior tag

    Sziasztok!
    Adott egy függvényem, aminek az első bemenő paramétere int, viszont a 2. már lehet string, int, vagy objektum... a 3. 4. 5. paraméter szintúgy különböző típusok lehetnének.

    Azt vágom, hogy kell később vizsgálni, hogy milyen típus, de hogy kell a függvény paramétereit leírni, hogy híváskor elfogadjon akár számot, akár stringet, akár objektumot?

    Előre is köszi

    Mutatnál példát könnyebb lenne.

    Így bármennyi paramétert át tudsz adni:
    Method(int x, params object[] obj){}

    De nem tűnik túl tisztának így a kód, ha mutatsz belőle, lehet meg lehet csinálni jobban is.

  • fatal`
    titán

    Sziasztok!
    Adott egy függvényem, aminek az első bemenő paramétere int, viszont a 2. már lehet string, int, vagy objektum... a 3. 4. 5. paraméter szintúgy különböző típusok lehetnének.

    Azt vágom, hogy kell később vizsgálni, hogy milyen típus, de hogy kell a függvény paramétereit leírni, hogy híváskor elfogadjon akár számot, akár stringet, akár objektumot?

    Előre is köszi

    Attól függ mit szeretnél, C#-ban nincs union type. Ha csak kiírni ToString()-gel, akkor a #9320-ban említettek is megfelelőek lehetnek.

    Lehet több overloadot csinálni (persze 5 paraméternél ez baromi sok lenne), vagy pedig builder patternre (vagy ahhoz hasonlóra) lehet szükséged, bár ez konstruktornál hasznos.

    Akár típusra pattern matching is játszhat.

    A cél nélkül nehéz megmondani :)

  • sztanozs
    veterán

    Sziasztok!
    Adott egy függvényem, aminek az első bemenő paramétere int, viszont a 2. már lehet string, int, vagy objektum... a 3. 4. 5. paraméter szintúgy különböző típusok lehetnének.

    Azt vágom, hogy kell később vizsgálni, hogy milyen típus, de hogy kell a függvény paramétereit leírni, hogy híváskor elfogadjon akár számot, akár stringet, akár objektumot?

    Előre is köszi

  • kiskornel
    addikt

    Sziasztok!
    Adott egy függvényem, aminek az első bemenő paramétere int, viszont a 2. már lehet string, int, vagy objektum... a 3. 4. 5. paraméter szintúgy különböző típusok lehetnének.

    Azt vágom, hogy kell később vizsgálni, hogy milyen típus, de hogy kell a függvény paramétereit leírni, hogy híváskor elfogadjon akár számot, akár stringet, akár objektumot?

    Előre is köszi

  • martonx
    veterán

    Nem, dehogyis, nyitottam a solution-ön belül egy teljesen új .Net Core 3.1-es projectet, a már létező .Net 4.5-ös console és az ugyancsak 4.5-ös service mellé.

    A service pojecten belül még van 4 db class-em, amik a tényleges munkát végzik, úgy vannak megírva, hogy ne függjenek az adott projecttől (példa: Ac, Bc, Cc, Dc, ezek a class-ek más-más feladatot csinálnak). A service is és a console is ugyanezeket használja.
    A console pl. nem tartalmaz mást, mint 4 db szöveges menüpontot, az 1, 2, 3 és 4 gomb lenyomására voltaképp a fenti class-ek [Ac|Bc|Cc|Dc].Run() nevű metódusát hívják meg és végrehajtják.
    A service is voltaképp ugyanezt csinálja, csak időzítetten, mint egy crontab, megadott időben az Ac.Run(), Bc.Run(), stb hívogatódik, de emellett persze mást is: compactolja az SQLite-ot, futtatja a mini webservert, backupolja a MySQL és az SQLite db-ket.

    Az eredeti elképzelés az volt, hogy a kettő egyben lenne (service-ként, amit a --console argumentummal lehet "menüsíteni"), Windows alatt simán működik is amúgy, alapvetően a --console arggal simán bedobja a console menüt, ketté is van választva a Main() (if (--console) RunConsole(); else RunService();), ez Windows alatt csodásan működik, de a Linux közli, hogy service programot csak service-ként lehet futtatni. Végül a Linux miatt készült egy pár soros Main()-ből álló console verzió is, aminek a tartalma a megírás óta nem változott (ahogy említettem, a menüt futtatja), de igazából a service Main()-je sem... hisz minden abban a 4 db class-ben módosul/frissül.

    Tehát, összegezve... van egy 4 db classből álló feladatcsomagom, amik a Raspberry Pi-n különböző feladatokat hajtanak végre. Emellett van egy console app, ami mauálisan ezeket a feladatokat futtatja, Win/Linux egyaránt. Van egy service-m, ami szintén ezeket futtatgatja, de időzítve, plusz a webes elérést biztosító webserver, plusz pár backup és hasonlók, minden olyasmi, amit egy állandóan a háttérben mozgó service kell hogy futtasson.

  • Keem1
    veterán

    Net api analyzer. Keress rá, rakd fel a VSre és futtasd le mindenféle net standard és net core targetekre, compatibility pack opcióval és anélkül.

    Egyébként mit csináltál? Átraktad a target frameworkot 4.5 ről netcore 3.1 re és most futási időben kapsz hibát? Hogyan futtattad ezt eddig linuxon?

    Amikor átállítottad a target frameworkot, akkor kellett compatibilitás csomagot feltenni?

    Nem, dehogyis, nyitottam a solution-ön belül egy teljesen új .Net Core 3.1-es projectet, a már létező .Net 4.5-ös console és az ugyancsak 4.5-ös service mellé.

    A service pojecten belül még van 4 db class-em, amik a tényleges munkát végzik, úgy vannak megírva, hogy ne függjenek az adott projecttől (példa: Ac, Bc, Cc, Dc, ezek a class-ek más-más feladatot csinálnak). A service is és a console is ugyanezeket használja.
    A console pl. nem tartalmaz mást, mint 4 db szöveges menüpontot, az 1, 2, 3 és 4 gomb lenyomására voltaképp a fenti class-ek [Ac|Bc|Cc|Dc].Run() nevű metódusát hívják meg és végrehajtják.
    A service is voltaképp ugyanezt csinálja, csak időzítetten, mint egy crontab, megadott időben az Ac.Run(), Bc.Run(), stb hívogatódik, de emellett persze mást is: compactolja az SQLite-ot, futtatja a mini webservert, backupolja a MySQL és az SQLite db-ket.

    Az eredeti elképzelés az volt, hogy a kettő egyben lenne (service-ként, amit a --console argumentummal lehet "menüsíteni"), Windows alatt simán működik is amúgy, alapvetően a --console arggal simán bedobja a console menüt, ketté is van választva a Main() (if (--console) RunConsole(); else RunService();), ez Windows alatt csodásan működik, de a Linux közli, hogy service programot csak service-ként lehet futtatni. Végül a Linux miatt készült egy pár soros Main()-ből álló console verzió is, aminek a tartalma a megírás óta nem változott (ahogy említettem, a menüt futtatja), de igazából a service Main()-je sem... hisz minden abban a 4 db class-ben módosul/frissül.

    Tehát, összegezve... van egy 4 db classből álló feladatcsomagom, amik a Raspberry Pi-n különböző feladatokat hajtanak végre. Emellett van egy console app, ami mauálisan ezeket a feladatokat futtatja, Win/Linux egyaránt. Van egy service-m, ami szintén ezeket futtatgatja, de időzítve, plusz a webes elérést biztosító webserver, plusz pár backup és hasonlók, minden olyasmi, amit egy állandóan a háttérben mozgó service kell hogy futtasson.

  • joysefke
    veterán

    Hát ez remek.. :((
    Jó, akkor ezt egyelőre jegelem, nincs kedvem vacakolni egy olyan funkcióval, ami 4.5 alatt pár sor, .NET Core alatt meg egy csomó macera.
    Majd ha lesz tengernyi időm, akkor szenvedek még vele.

    Köszi azért...

    Net api analyzer. Keress rá, rakd fel a VSre és futtasd le mindenféle net standard és net core targetekre, compatibility pack opcióval és anélkül.

    Egyébként mit csináltál? Átraktad a target frameworkot 4.5 ről netcore 3.1 re és most futási időben kapsz hibát? Hogyan futtattad ezt eddig linuxon?

    Amikor átállítottad a target frameworkot, akkor kellett compatibilitás csomagot feltenni?

  • joysefke
    veterán

    Ok meggyőztetek. Viszont elakadtam, még egy egyszerű tutorial se megy. Windowson oké, Linuxon nem. Mutatom, légyszi segítsetek. :R

    Úgy néz ki, hogy a kis projektem minden egyéb eleme megy Linuxon is, csak a service nem működik. Amúgy tök jó ötlet volt megszabadulni 41 warningtól (unused variable) meg kikukáztam pár, már sehol nem használt metódust is :DDD
    Valahogy ezt a nyamvadt service-t kéne megszülni. Az átoperálás után Windowson az eredeti service .Net Core 3.1-en is megy, és megy az alábbi példa is. Linuxon egyik se.
    Ja, és console appként Linuxon is kiválóan megy, az SQLite is :C
    Csak a service nem... :U

    [link]

    Eredmény Linuxon ( .Net Core 3.1)
    Unhandled exception. System.PlatformNotSupportedException: ServiceController enables manipulating and accessing Windows services and it is not applicable for other operating systems.
    at System.ServiceProcess.ServiceBase..ctor()
    at Testing.LoggingService..ctor()
    at Testing.Program.Main(String[] args) in E:\..\Program.cs:line 39
    Félbeszakítva

    .

  • Keem1
    veterán

    Hát, elég egyértelmű az exception :D
    .NET Core 3-al bekerültek olyan api-k is, amik nem platformfüggetlenek. Pl. WPF kódot lehet .NET Core 3-al írni, de ettől még nem fogod tudni linuxon futtatni, ha tippelnem kéne akkor a System.ServiceProcess is ilyen

    [link]
    Szerintem ezt a linket nézd meg, itt jó eséllyel találsz megoldást

    Hát ez remek.. :((
    Jó, akkor ezt egyelőre jegelem, nincs kedvem vacakolni egy olyan funkcióval, ami 4.5 alatt pár sor, .NET Core alatt meg egy csomó macera.
    Majd ha lesz tengernyi időm, akkor szenvedek még vele.

    Köszi azért...

  • Alexios
    veterán

    Ok meggyőztetek. Viszont elakadtam, még egy egyszerű tutorial se megy. Windowson oké, Linuxon nem. Mutatom, légyszi segítsetek. :R

    Úgy néz ki, hogy a kis projektem minden egyéb eleme megy Linuxon is, csak a service nem működik. Amúgy tök jó ötlet volt megszabadulni 41 warningtól (unused variable) meg kikukáztam pár, már sehol nem használt metódust is :DDD
    Valahogy ezt a nyamvadt service-t kéne megszülni. Az átoperálás után Windowson az eredeti service .Net Core 3.1-en is megy, és megy az alábbi példa is. Linuxon egyik se.
    Ja, és console appként Linuxon is kiválóan megy, az SQLite is :C
    Csak a service nem... :U

    [link]

    Eredmény Linuxon ( .Net Core 3.1)
    Unhandled exception. System.PlatformNotSupportedException: ServiceController enables manipulating and accessing Windows services and it is not applicable for other operating systems.
    at System.ServiceProcess.ServiceBase..ctor()
    at Testing.LoggingService..ctor()
    at Testing.Program.Main(String[] args) in E:\..\Program.cs:line 39
    Félbeszakítva

    Hát, elég egyértelmű az exception :D
    .NET Core 3-al bekerültek olyan api-k is, amik nem platformfüggetlenek. Pl. WPF kódot lehet .NET Core 3-al írni, de ettől még nem fogod tudni linuxon futtatni, ha tippelnem kéne akkor a System.ServiceProcess is ilyen

    [link]
    Szerintem ezt a linket nézd meg, itt jó eséllyel találsz megoldást

  • Keem1
    veterán

    Ok meggyőztetek. Viszont elakadtam, még egy egyszerű tutorial se megy. Windowson oké, Linuxon nem. Mutatom, légyszi segítsetek. :R

    Úgy néz ki, hogy a kis projektem minden egyéb eleme megy Linuxon is, csak a service nem működik. Amúgy tök jó ötlet volt megszabadulni 41 warningtól (unused variable) meg kikukáztam pár, már sehol nem használt metódust is :DDD
    Valahogy ezt a nyamvadt service-t kéne megszülni. Az átoperálás után Windowson az eredeti service .Net Core 3.1-en is megy, és megy az alábbi példa is. Linuxon egyik se.
    Ja, és console appként Linuxon is kiválóan megy, az SQLite is :C
    Csak a service nem... :U

    [link]

    Eredmény Linuxon ( .Net Core 3.1)
    Unhandled exception. System.PlatformNotSupportedException: ServiceController enables manipulating and accessing Windows services and it is not applicable for other operating systems.
    at System.ServiceProcess.ServiceBase..ctor()
    at Testing.LoggingService..ctor()
    at Testing.Program.Main(String[] args) in E:\..\Program.cs:line 39
    Félbeszakítva

  • martonx
    veterán

    Nem, Linuxon nem ezt a path-t használtam :)
    Viszont megvan a hiba, nem a Microsoft.Data.Sqlite.Core kell, hanem a Microsoft.Data.Sqlite. Úgy műxik.
    Vannak névkonvencióbeli eltérések a hivatalos verzió és a Microsoft sajátja között, azt már észrevettem. Na de ez a hülyeség, hogy nem mondhatom meg, hogy a DB-m milyen verziójú, ez nonszensz :D

    De úgy tűnik, ezzel tényleg működik ARM alatt.

    No offense, de ha már itt tartunk. Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
    Én úgy tudtam, az adott programnyelv, környezet csak egy eszköz, semmiképp sem határozza meg a végtermék minőségét. Akár lyukkártyával is megoldhatnám az adott feladatot - más kérdés, hogy meg tudom-e :DDD

    Igen, tudom, a Core eleve opensource-nak, végre platformfüggetlennek készült (más kérdés, hogy eredetileg a .Net is, a Java babérjaira akart törni a 2000-es évek elején), de miért gáz jelenleg .Net-et használni helyette, ha egyébként tökéletesen működik és fejlesztik is?

    Látom a többiek időközben megválaszolták a jövő vs. miért ne ragadjunk a múltban, hiszen kényelmes kérdésedet.

  • joysefke
    veterán

    Nem, Linuxon nem ezt a path-t használtam :)
    Viszont megvan a hiba, nem a Microsoft.Data.Sqlite.Core kell, hanem a Microsoft.Data.Sqlite. Úgy műxik.
    Vannak névkonvencióbeli eltérések a hivatalos verzió és a Microsoft sajátja között, azt már észrevettem. Na de ez a hülyeség, hogy nem mondhatom meg, hogy a DB-m milyen verziójú, ez nonszensz :D

    De úgy tűnik, ezzel tényleg működik ARM alatt.

    No offense, de ha már itt tartunk. Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
    Én úgy tudtam, az adott programnyelv, környezet csak egy eszköz, semmiképp sem határozza meg a végtermék minőségét. Akár lyukkártyával is megoldhatnám az adott feladatot - más kérdés, hogy meg tudom-e :DDD

    Igen, tudom, a Core eleve opensource-nak, végre platformfüggetlennek készült (más kérdés, hogy eredetileg a .Net is, a Java babérjaira akart törni a 2000-es évek elején), de miért gáz jelenleg .Net-et használni helyette, ha egyébként tökéletesen működik és fejlesztik is?

    Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?

    Én inkább úgy fogalmaznék, hogy ha valami 3rd party packaget használsz, akkor ha az nincsen .Net Standard-re (lehetőleg max 2.0-ig) akkor az felejtős. Ha van, akkor az jó, mert egy esetleges net framework => net core át-targetelésnek nem fog útjában állni.

    Én semmilyen körülmények között nem használnék olyan 3rd party libet ahol nem látom azt, hogy az arra épülő kódomat át tudom változtatás nélkül emelni akkor is ha futtatókörnyezetet váltok alatta. (lépek frameworkről 4.X-ről Core-ra)

    Ezzel párhuzamosan ha kódot írok próbálom úgy szervezni, hogy közvetlenül framework 4.x-et targetelő projekt(ekbe) minél kevesebb kerüljön és inkább átcsoportosítom olyan projektekbe amelyek netstandard2.0-át targetelnek.

  • Keem1
    veterán

    A .NET fw 4.8-al véget ért, security patchek érkeznek hozzá egy darabig, és kész. Idén jön a .NET 5, az már a core-ra épül, ez a jövő
    Inkább pont fordítva, mi értelme .net fw-ben egy új projektet kezdeni?(főleg 4.5-ben)

    Ráadásul ha linuxon is akarsz .net-et futtatni, eleve nem látom értelmét mással kezdeni, mint az ott natívan támogatott .net core-al

    Sajnos igazad van :(
    Azt hittem, párhuzamos lesz a kettő, de itt is mást írnak.

    All future investment in .NET will be in .NET Core,” says Microsoft. “.NET Framework 4.8 will be the last major version of .NET Framework.”

  • Alexios
    veterán

    Nem, Linuxon nem ezt a path-t használtam :)
    Viszont megvan a hiba, nem a Microsoft.Data.Sqlite.Core kell, hanem a Microsoft.Data.Sqlite. Úgy műxik.
    Vannak névkonvencióbeli eltérések a hivatalos verzió és a Microsoft sajátja között, azt már észrevettem. Na de ez a hülyeség, hogy nem mondhatom meg, hogy a DB-m milyen verziójú, ez nonszensz :D

    De úgy tűnik, ezzel tényleg működik ARM alatt.

    No offense, de ha már itt tartunk. Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
    Én úgy tudtam, az adott programnyelv, környezet csak egy eszköz, semmiképp sem határozza meg a végtermék minőségét. Akár lyukkártyával is megoldhatnám az adott feladatot - más kérdés, hogy meg tudom-e :DDD

    Igen, tudom, a Core eleve opensource-nak, végre platformfüggetlennek készült (más kérdés, hogy eredetileg a .Net is, a Java babérjaira akart törni a 2000-es évek elején), de miért gáz jelenleg .Net-et használni helyette, ha egyébként tökéletesen működik és fejlesztik is?

    A .NET fw 4.8-al véget ért, security patchek érkeznek hozzá egy darabig, és kész. Idén jön a .NET 5, az már a core-ra épül, ez a jövő
    Inkább pont fordítva, mi értelme .net fw-ben egy új projektet kezdeni?(főleg 4.5-ben)

    Ráadásul ha linuxon is akarsz .net-et futtatni, eleve nem látom értelmét mással kezdeni, mint az ott natívan támogatott .net core-al

  • Keem1
    veterán

    Gyors Guglizás után a version keyword nem támogatott Microsoft.Data.Sqlite.Core alatt függetlenül az operációs rendszertől, más kérdés, hogy Linux alatt szerintem eleve helytelen útvonal az F:\chinook.db
    Helyette Mode=ReadOnly kell a connectionstringbe?

    https://entityframeworkcore.com/knowledge-base/53662829/-net-core-ef6-fehler-mit-sqlite-verbindungszeichenfolge

    Nem, Linuxon nem ezt a path-t használtam :)
    Viszont megvan a hiba, nem a Microsoft.Data.Sqlite.Core kell, hanem a Microsoft.Data.Sqlite. Úgy műxik.
    Vannak névkonvencióbeli eltérések a hivatalos verzió és a Microsoft sajátja között, azt már észrevettem. Na de ez a hülyeség, hogy nem mondhatom meg, hogy a DB-m milyen verziójú, ez nonszensz :D

    De úgy tűnik, ezzel tényleg működik ARM alatt.

    No offense, de ha már itt tartunk. Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
    Én úgy tudtam, az adott programnyelv, környezet csak egy eszköz, semmiképp sem határozza meg a végtermék minőségét. Akár lyukkártyával is megoldhatnám az adott feladatot - más kérdés, hogy meg tudom-e :DDD

    Igen, tudom, a Core eleve opensource-nak, végre platformfüggetlennek készült (más kérdés, hogy eredetileg a .Net is, a Java babérjaira akart törni a 2000-es évek elején), de miért gáz jelenleg .Net-et használni helyette, ha egyébként tökéletesen működik és fejlesztik is?

  • martonx
    veterán

    Köszönöm a tanácsot, de úgy néz ki, ez is elfailel, bár ez más miatt. :F

    Már akkor elkezdtem ijedezni, mikor még Windows alatt is belebotlott a bicskája a connection stringben átadott "version" paraméterben, aminek eddig sem PHP, sem .NET 4.5, sem Java alatt nem volt baja :DDD

    Ez az én kis teszt kódom SQLite teszteléshez:
    using (SqliteConnection conn = new SqliteConnection($@"Data Source=F:\chinook.db;Version=3"))
    {
            conn.Open();
            using (SqliteCommand cmd = new SqliteCommand("SELECT `name` FROM sqlite_master WHERE type='table';", conn))
            {
                    SqliteDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                            System.Console.WriteLine(reader.GetString(0));
                    }
            }
    }

    És Linux alatt ezt kaptam:
    Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 14: 'unable to open database file'.
    at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
    at Microsoft.Data.Sqlite.SqliteConnection.Open()
    at Program.Main(String[] args) in ...\Program.cs:line 24

    Gyors Guglizás után a version keyword nem támogatott Microsoft.Data.Sqlite.Core alatt függetlenül az operációs rendszertől, más kérdés, hogy Linux alatt szerintem eleve helytelen útvonal az F:\chinook.db
    Helyette Mode=ReadOnly kell a connectionstringbe?

    https://entityframeworkcore.com/knowledge-base/53662829/-net-core-ef6-fehler-mit-sqlite-verbindungszeichenfolge

  • martonx
    veterán

    Ezen már sokat gondolkodtam, de sok Nugetes motyóm nem kompatibilis vele. Pl. az SQLite (System.Data.Sqlite) sem, ARM-re nem volt 4.5-re sem, de oda simán fordítottam egyet az eszközön forráskódból. .Net Core-ra viszont eddig még nem sikerült.

    (#9298) joysefke:
    A Task-on már én is agyaltam, de amikor próbálkoztam, valahogy nem jött össze. Már nem emlékszem, hogy egy statikus metódussal gyűlt-e meg a baja, vagy azon aztán átlendültem és máshol akadtam el. Aztán végül a Bgwk lett az első, ami működött.

    Sajnos nem vagyok programozó, csak egy lelkes amatőr, így ha valahol elakadok, hajlamos vagyok rövidebb utat választani :DDD Viszont a C#-ot szeretem, így néha olyan célra is ezt választom, ami szkriptnyelvből, Powershellből is megoldható lenne (melyekhez még a C#-hoz képest is kevésbé mozgok otthonosan).

    Ne mondd már: https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/3.1.8
    Talán 2-3 évvel ezelőtt ez igaz is lehetett, manapság ami nincs .Net Core-hoz, azzal nem is érdemes foglalkozni.

  • Keem1
    veterán

    Gondolom az a probléma, hogy ez(legalábbis a leírása alapján) x86 vagy x64. Viszont netcore alatt a Microsoft.Data.Sqlite csomagnak is mennie kéne, és azzal szerintem lehet használni ef core-t arm-on is.

    Köszönöm a tanácsot, de úgy néz ki, ez is elfailel, bár ez más miatt. :F

    Már akkor elkezdtem ijedezni, mikor még Windows alatt is belebotlott a bicskája a connection stringben átadott "version" paraméterben, aminek eddig sem PHP, sem .NET 4.5, sem Java alatt nem volt baja :DDD

    Ez az én kis teszt kódom SQLite teszteléshez:
    using (SqliteConnection conn = new SqliteConnection($@"Data Source=F:\chinook.db;Version=3"))
    {
            conn.Open();
            using (SqliteCommand cmd = new SqliteCommand("SELECT `name` FROM sqlite_master WHERE type='table';", conn))
            {
                    SqliteDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                            System.Console.WriteLine(reader.GetString(0));
                    }
            }
    }

    És Linux alatt ezt kaptam:
    Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 14: 'unable to open database file'.
    at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
    at Microsoft.Data.Sqlite.SqliteConnection.Open()
    at Program.Main(String[] args) in ...\Program.cs:line 24

  • Keem1
    veterán

    A Task-on már én is agyaltam, de amikor próbálkoztam, valahogy nem jött össze.

    Tessék, ez így működik, gyakorlatilag semmit sem változtattam azon amit bemásoltál. (net framework 4.7.2 + ASP net core 2.1)

    A Console.Readkey(). tartja életben a main thredet, az pedig közvetve a webservice-t. élesben nyilván a console.Readkey helyett valami olyan szerver metódusod lesz, ami sosem ér véget, ezáltal a backgroundban futó futó webservice is életben marad.

    szerk (ne az IIS profillal futtasd)

        public class Program
        {
            static Task _webService;
            public static async Task Main(string[] args)
            {
                Debug.WriteLine("WebGUI Teszt");
                _webService = StartWebGui();
                Console.ReadKey();
            }

            static async Task StartWebGui()
            {
                var hostBuilder = new WebHostBuilder()
                        .UseKestrel()
                        .UseStartup<Startup>()
                        .UseUrls("http://localhost:808/")
                        .Build();
                await hostBuilder.RunAsync();
            }
        }

    Köszönöm. ezt kipróbálom :)

    "élesben nyilván a console.Readkey helyett valami olyan szerver metódusod lesz, ami sosem ér véget, ezáltal a backgroundban futó futó webservice is életben marad"

    Igen, ezt nagyon jól látod, a solution-ön belül két projectem van, a service, meg egy CLI verzió, próbálom mindkettőt életben tartani, mindkettőt tovább vinni. A CLI alapvetően teszteléshez, debuggoláshoz kell, amit bemásoltam, az onnan való, a service másképp működik.

    Sematikusan:
    ---- Service (project)
    ---------- servicemethods.cs
    ---------- program.cs
    ---- CLI (project)
    ---------- program.cs (<--- servicemethods.cs)

    Itt válnak ketté :)
    Windows alatt a service-t lehet CLI-ként is futtatni, sajnos Linux alatt nem.
    Ha Linux alatt futtatom, ezt kapom: Use mono-service to start service processes

    Ezért fordítok egy második exe-t is, ami gyakorlatilag a paraméterek alapján hívogatja a fő class motyóit. A két program.cs pedig ezeket használja. Az egyik serviceként a másik pedig programként.

    #region Service class
    public class Service : ServiceBase
    {
    public Service()
    {
    ServiceName = Program.ServiceName;
    }
    protected override void OnStart(string[] args)
    {
    Program.OnStart(args);
    }
    protected override void OnStop()
    {
    Program.OnStop();
    }
    }
    #endregion
    #region Main method, application's entry point
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {
    AppInfo.UseLocalDatabaseFolder = true;
    if (System.Environment.UserInteractive)
    {
    ics.logger.Info("Run as application");
    bool showMenu = true;
    while (showMenu)
    {
    showMenu = ConsoleApp.MainMenu();
    }
    }
    else
    {
    ics.logger.Info("Run as service");
    using (var service = new Service())
    {
    ServiceBase.Run(service);
    }
    }
    }
    #endregion

  • joysefke
    veterán

    Ezen már sokat gondolkodtam, de sok Nugetes motyóm nem kompatibilis vele. Pl. az SQLite (System.Data.Sqlite) sem, ARM-re nem volt 4.5-re sem, de oda simán fordítottam egyet az eszközön forráskódból. .Net Core-ra viszont eddig még nem sikerült.

    (#9298) joysefke:
    A Task-on már én is agyaltam, de amikor próbálkoztam, valahogy nem jött össze. Már nem emlékszem, hogy egy statikus metódussal gyűlt-e meg a baja, vagy azon aztán átlendültem és máshol akadtam el. Aztán végül a Bgwk lett az első, ami működött.

    Sajnos nem vagyok programozó, csak egy lelkes amatőr, így ha valahol elakadok, hajlamos vagyok rövidebb utat választani :DDD Viszont a C#-ot szeretem, így néha olyan célra is ezt választom, ami szkriptnyelvből, Powershellből is megoldható lenne (melyekhez még a C#-hoz képest is kevésbé mozgok otthonosan).

    A Task-on már én is agyaltam, de amikor próbálkoztam, valahogy nem jött össze.

    Tessék, ez így működik, gyakorlatilag semmit sem változtattam azon amit bemásoltál. (net framework 4.7.2 + ASP net core 2.1)

    A Console.Readkey(). tartja életben a main thredet, az pedig közvetve a webservice-t. élesben nyilván a console.Readkey helyett valami olyan szerver metódusod lesz, ami sosem ér véget, ezáltal a backgroundban futó futó webservice is életben marad.

    szerk (ne az IIS profillal futtasd)

        public class Program
        {
            static Task _webService;
            public static async Task Main(string[] args)
            {
                Debug.WriteLine("WebGUI Teszt");
                _webService = StartWebGui();
                Console.ReadKey();
            }

            static async Task StartWebGui()
            {
                var hostBuilder = new WebHostBuilder()
                        .UseKestrel()
                        .UseStartup<Startup>()
                        .UseUrls("http://localhost:808/")
                        .Build();
                await hostBuilder.RunAsync();
            }
        }

  • Alexios
    veterán

    Gondolom az a probléma, hogy ez(legalábbis a leírása alapján) x86 vagy x64. Viszont netcore alatt a Microsoft.Data.Sqlite csomagnak is mennie kéne, és azzal szerintem lehet használni ef core-t arm-on is.

Új hozzászólás Aktív témák