Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

CelikNET: LGPL CLR Interop Wrapper za CelikAPI

[es] :: .NET :: CelikNET: LGPL CLR Interop Wrapper za CelikAPI
(TOP topic, by mmix)
Strane: << < .. 2 3 4 5 6 7 8

[ Pregleda: 70200 | Odgovora: 147 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nesomis
Nova Varoš

Član broj: 36830
Poruke: 8
95.180.73.*

Jabber: nesomis
Sajt: www.vaznesenjska.rs


Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI24.05.2020. u 12:30 - pre 47 meseci
Citat:
bokinet: @nesomis
Sta je sporno? U cemu se sastoji problem?
Pre svega, da li MUP Celik app radi na vasem racunaru?


@bokinet
Sporno je to što ne mogu da koristim CelikNET ni na jednoj mašini ma koji OS ili VS imao. Verovatno negde grešim u koracima i više ne znam šta da radim. Ukoliko ste raspoloženi da pomognete pošaljite mi privatnu poruku pa da se dogovorimo kada možete da se povežete i pogledate sami kako stvari stoje. Pokazaću Vam šta sam sve pokušavao.

Ono što meni treba je mogućnost iščitavanja ličnih karata u C# i VB preko najnovijeg CelikAPI-ja.
Hristos Voskrese !!!
 
Odgovor na temu

nesomis
Nova Varoš

Član broj: 36830
Poruke: 8
95.180.73.*

Jabber: nesomis
Sajt: www.vaznesenjska.rs


Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI25.05.2020. u 20:31 - pre 47 meseci
Moram da se zahvalim bokinetu na nesebičnoj pomoći, odvojenom vremenu i rešenju koje mi je prosledio, a koje ću moći da iskoristim u svom projektu.
Ja ću nastaviti da istražujem dalje. Čim dođem do svog rešenja za koje mislim da mi je pred nosom, podeliću ga svima koji budu zaintersovani za njega.

Hristos Voskrese !!!
 
Odgovor na temu

andrija032
programer
AndrijaSoft
Čačak

Član broj: 343657
Poruke: 2
*.static.isp.telekom.rs.



Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI03.06.2020. u 10:22 - pre 47 meseci
Pokusavam već nekoliko dana da pokrenem Windows aplikaciju u kojoj zelim da citam licnu kartu i svaki put kad probam pa procitam licnu kartu, dobijam sledecu gresku:

Could not load file or assembly 'CelikNET.dll' or one of its dependencies. is not a valid Win32 application.

Probao sam na nekoliko racunara i nista.

Da li bi neko mogao da mi pomogne, koristim VS 2017

Pozdrav.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI04.06.2020. u 10:03 - pre 47 meseci
Postoje tu dva dll-a, jedan je CelikApi.dll u kome je sva funkcionalnost, a drugi je CelikNET.dll koji olakšava korišćenje ovog prvog u .NET aplikacijama. Taj CelikApi.dll mora da stoji na sistemskoj putanji. Ta putanja je PATH variabla, ako si nekad čuo za to. Neki vole da iskopiraju CelikApi.dll u C:\Windows\System32 folder, ali Mikrosoft to ne preporučuje.

Preporučeni način je da iskopiraš fajl negde u C:\Program Files, recimo u folder C:\Program Files\Common Files\andrija032. I onda taj folder dodaš u PATH (idi u Control Panel\All Control Panel Items\System, klikni na Advanced system settings, u novom prozoru u tabu Advanced klikni na Environment Variables, odaberi variablu Path, klikni Edit, i dodaj putanju do željenog foldera (putanje su međusobno razdvojene znakom tačka-zarez (;)).
 
Odgovor na temu

andrija032
programer
AndrijaSoft
Čačak

Član broj: 343657
Poruke: 2
*.com
Via: [es] mailing liste



Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI04.06.2020. u 10:21 - pre 47 meseci
>
 
Odgovor na temu

nesomis
Nova Varoš

Član broj: 36830
Poruke: 8
95.180.73.*

Jabber: nesomis
Sajt: www.vaznesenjska.rs


Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.06.2020. u 00:52 - pre 47 meseci
Novi dan, novi problem.

1. Preuzeo sam Source fajl iz prvog posta i nisam menjao ništa u kodu i nisam menjao verziju CelikAPI-ja. Znači sve je ostalo
2. Napravio sam folder na c disku i dodao putanju u Environment Variables i restartovao komp da bi putanja bila vidljiva operativnom sistemu. U ovaj folder sam smestio CelikAPI.dll i CelikNet.dll
3. U VS 2019 sam pokrenuo projekat i retargetirao ga na ( Windows SDK Version 10.0 )
4. Ostavio sam .NET Framework na V4.0
5. CelikNet na platormi Win32
6. ConsoleTester na platformi x86
7. Solution na platformi x86
8. Kada pokrenem aplikaciju na konzoli se ispiše "Podaci o licnoj karti ---------------------------------" i dolazi do prekida sa greškom CelikNET.CelikException: 'ReadDocumentData nije izvrsen'

Šta dalje?


Hristos Voskrese !!!
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.06.2020. u 11:16 - pre 47 meseci
Pokaži nam svoj kod. Uzgred, nadam se da si u projekat iz prve strane topika implementirao i izmene napisane u postu od 18.09.2014.
 
Odgovor na temu

nesomis
Nova Varoš

Član broj: 36830
Poruke: 8
95.180.73.*

Jabber: nesomis
Sajt: www.vaznesenjska.rs


Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.06.2020. u 19:33 - pre 47 meseci
Evo koda za CelikNET. Promenjena je samo 163 linija

Code:
/*  
    This file is part of CelikNET.

    CelikNET is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

    CelikNET is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with CelikNET.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "StdAfx.h"

#pragma once

using namespace System;
using namespace System::Text;
using namespace System::Drawing;
using namespace System::IO;
using namespace System::Runtime::InteropServices;

namespace CelikNET {

    public ref class CelikException sealed: Exception 
    {
    public: 
        CelikException(String^ message, int ErrorCode): Exception(message), _EIDErrorCode(ErrorCode) {}
        property int EIDErrorCode { int get() { return _EIDErrorCode; }; }
        property String^ EIDErrorDescriptionEn { 
            String^ get() 
            {
                switch(EIDErrorCode) 
                {
                    case EID_OK: return "Operation completed succesfully"; 
                    case EID_E_GENERAL_ERROR: return "General error";
                    case EID_E_INVALID_PARAMETER: return "Invalid parameter";
                    case EID_E_VERSION_NOT_SUPPORTED: return "Version not supported";
                    case EID_E_NOT_INITIALIZED: return "Not initialized";
                    case EID_E_UNABLE_TO_EXECUTE: return "Unable to execute";
                    case EID_E_READER_ERROR: return "Reader error";
                    case EID_E_CARD_MISSING: return "Card missing";
                    case EID_E_CARD_UNKNOWN: return "Card unknown";
                    case EID_E_CARD_MISMATCH: return "Card mismatch";
                    case EID_E_UNABLE_TO_OPEN_SESSION: return "Unable to open session";
                    case EID_E_DATA_MISSING: return "Data missing";
                    case EID_E_CARD_SECFORMAT_CHECK_ERROR: return "Card security format check error";
                    case EID_E_SECFORMAT_CHECK_CERT_ERROR: return "Security format check certificate error";
                    default: return "Unknown error, consult documentation";
                }
            }; 
        }
        property String^ EIDErrorDescriptionSr { 
            String^ get() 
            {
                switch(EIDErrorCode) 
                {
                    case EID_OK: return L"Operacija uspešno završena"; 
                    case EID_E_GENERAL_ERROR: return L"Opšta greška";
                    case EID_E_INVALID_PARAMETER: return L"Neispravan parametar";
                    case EID_E_VERSION_NOT_SUPPORTED: return L"Ova verzija API-a nije podržana";
                    case EID_E_NOT_INITIALIZED: return L"Biblioteka nije inicijalizovana";
                    case EID_E_UNABLE_TO_EXECUTE: return L"Biblioteka ne može izvršiti operaciju";
                    case EID_E_READER_ERROR: return L"Greška u čitaču kartica";
                    case EID_E_CARD_MISSING: return L"Kartica nije prisutna u čitaču";
                    case EID_E_CARD_UNKNOWN: return L"Nepoznata kartica u čitaču";
                    case EID_E_CARD_MISMATCH: return L"Pogrešna kartica u čitaču";
                    case EID_E_UNABLE_TO_OPEN_SESSION: return L"Biblioteka ne može da otvori sesiju";
                    case EID_E_DATA_MISSING: return L"Podaci nisu prisutni na kartici";
                    case EID_E_CARD_SECFORMAT_CHECK_ERROR: return L"Sigurnosna greška u formatu kartice";
                    case EID_E_SECFORMAT_CHECK_CERT_ERROR: return L"Greška pri proveri sertifikata na kartici";
                    default: return L"Nepoznata greška, konsultujte dokumentaciju";
                }
            }; 
        }

    private:
        int _EIDErrorCode;
    };


    // data strukture
    // --------------------------------------------------------------------------------------------------

    /// <summary>
    /// Sadrzi osnovne informacije o licnoj karti
    /// </summary>
    public ref struct DocumentData
    {
    public:
        String^ docRegNo;
        String^ issuingDate;
        String^ expiryDate;
        String^ issuingAuthority;
    };
    /// <summary>
    /// Sadrzi osnovne informacije o nosiocu licne karte
    /// </summary>
    public ref struct FixedPersonalData
    {
    public:
        String^ personalNumber;
        String^ surname;
        String^ givenName;
        String^ parentGivenName;
        String^ sex;
        String^ placeOfBirth;
        String^ stateOfBirth;
        String^ dateOfBirth;
        String^ communityOfBirth;
    };

    /// <summary>
    /// Sadrzi dodatne informacije o nosiocu licne karte
    /// </summary>
    public ref struct VariablePersonalData
    {
    public:
        String^ state;
        String^ community;
        String^ place;
        String^ street;
        String^ houseNumber;
        String^ houseLetter;
        String^ entrance;
        String^ floor;
        String^ apartmentNumber;
    };

    // interop klasa
    // --------------------------------------------------------------------------------------------------

    public ref class CelikInterop sealed
    {
    private:
        /// <summary>
        /// nested klasa koja sluzi kao global destructor/finalizer
        /// </summary>
        ref class CelikInteropCleaner sealed
        {
        internal:
            static CelikInteropCleaner^ _instance = gcnew CelikInteropCleaner();
            static property CelikInteropCleaner^ singleton { CelikInteropCleaner^ get() { return _instance; } }
        private:
            CelikInteropCleaner() {}
            ~CelikInteropCleaner() { this->!CelikInteropCleaner(); }
            !CelikInteropCleaner() 
            {
                // ovaj exception ako bude bice na kraju same aplikacije, ostavljen je zbog debug sesija
                int err;
                if ((err = EidCleanup()) != EID_OK) throw gcnew CelikException("Cleanup nije izvrsen", err);
            } 
        };

        static CelikInteropCleaner^  _cleaner;
        /// <summary>
        /// Globalni konstruktor za Celik Interop wrapper. Inicijalizuje Celik API, poziva se "skriveno" samo jednom
        /// </summary>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko Celik Startup nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        static CelikInterop() 
        {
            int err;
            if ((err = EidStartup(2)) != EID_OK) throw gcnew CelikException("Startup nije izvrsen", err);
            // startup je ok, kreiraj cleaner "singleton" ciji teardown ce ugasiti celik za slucaj da korisnik zaboravi
            _cleaner = CelikInteropCleaner::singleton;
        }

        // static dummy
        static int _dummy = 123;

    public:
        /// <summary>
        /// Globalni cleanup za Celik Interop wrapper. Ovo je poslednji CelikNET poziv u aplikaciji, posle njega vise nece raditi instanciranje i pozivanje CelikNET objekata/metoda. Alternativno mozete pustiti aplikaciju da se sama ocisti
        /// </summary>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko Celik Cleanup nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        static void Cleanup() 
        {
            //manuelni tear down celika, ako je cleaner inicijalizovan ovo ce deterministicki pozvadi dispose patern i uraditi zatvaranje 
            delete _cleaner;
        }

        /// <summary>
        /// Konstruktor za Celik Interop wrapper. Inicijalizuje Read operaciju kroz EidBeginRead i omogucava poziv blok komandi
        /// </summary>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko BeginRead nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        CelikInterop() 
        {
            // pipni staticko polje da bi naterao kompajler da pozove sttaicki konstruktor prvi put
            // http://connect.microsoft.com/V...or-not-called-in-release-build
            int dummy = CelikInterop::_dummy;
            // init read
            int err;
            if ((err = EidBeginRead("")) != EID_OK) throw gcnew CelikException("BeginRead nije izvrsen", err);
        }

        ~CelikInterop() 
        {
            // dispose pattern, pozovi finalizer
            this->!CelikInterop();
        }


        /// <summary>
        /// Ucitava osnovne podatke sa licne karte
        /// </summary>
        /// <returns>Instanca <see cref="CelikNET::FixedPersonalData">CelikNET::FixedPersonalData</see> klase u kojoj su podaci</returns>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko ReadFixedPersonalData nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        FixedPersonalData^ ReadFixedPersonalData() 
        {
            msclr::lock l(CelikInteropCleaner::singleton); // thread global sync
            int err;
            PEID_FIXED_PERSONAL_DATA p = new EID_FIXED_PERSONAL_DATA;
            if ((err = EidReadFixedPersonalData(p)) != EID_OK) throw gcnew CelikException("ReadFixedPersonalData nije izvrsen", err);
            FixedPersonalData^ fpd = gcnew FixedPersonalData;
            fpd->personalNumber = decodeUTF8Buffer(p->personalNumber, p->personalNumberSize);
            fpd->surname = decodeUTF8Buffer(p->surname, p->surnameSize);
            fpd->givenName = decodeUTF8Buffer(p->givenName, p->givenNameSize);
            fpd->parentGivenName = decodeUTF8Buffer(p->parentGivenName, p->parentGivenNameSize);
            fpd->sex = decodeUTF8Buffer(p->sex, p->sexSize);
            fpd->placeOfBirth = decodeUTF8Buffer(p->placeOfBirth, p->placeOfBirthSize);
            fpd->stateOfBirth = decodeUTF8Buffer(p->stateOfBirth, p->stateOfBirthSize);
            fpd->dateOfBirth = decodeUTF8Buffer(p->dateOfBirth, p->dateOfBirthSize);
            fpd->communityOfBirth = decodeUTF8Buffer(p->communityOfBirth, p->communityOfBirthSize);
            return fpd;
        }


        /// <summary>
        /// Ucitava dodatne podatke sa licne karte
        /// </summary>
        /// <returns>Instanca <see cref="CelikNET::VariablePersonalData">CelikNET::VariablePersonalData</see> klase u kojoj su podaci</returns>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko ReadVariabelPersonalData nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        VariablePersonalData^ ReadVariablePersonalData() 
        {
            msclr::lock l(CelikInteropCleaner::singleton); // thread global sync
            int err;
            PEID_VARIABLE_PERSONAL_DATA p = new EID_VARIABLE_PERSONAL_DATA;
            if ((err = EidReadVariablePersonalData(p)) != EID_OK) throw gcnew CelikException("ReadVariablePersonalData nije izvrsen", err);
            VariablePersonalData^ vpd = gcnew VariablePersonalData;
            vpd->state = decodeUTF8Buffer(p->state, p->stateSize);
            vpd->community = decodeUTF8Buffer(p->community, p->communitySize);
            vpd->place = decodeUTF8Buffer(p->place, p->placeSize);
            vpd->street = decodeUTF8Buffer(p->street, p->streetSize);
            vpd->houseNumber = decodeUTF8Buffer(p->houseNumber, p->houseNumberSize);
            vpd->houseLetter = decodeUTF8Buffer(p->houseLetter, p->houseLetterSize);
            vpd->entrance = decodeUTF8Buffer(p->entrance, p->entranceSize);
            vpd->floor = decodeUTF8Buffer(p->floor, p->floorSize);
            vpd->apartmentNumber = decodeUTF8Buffer(p->apartmentNumber, p->apartmentNumberSize);
            return vpd;
        }
                
        /// <summary>
        /// Ucitava osnovne podatke sa licne karte
        /// </summary>
        /// <returns>Instanca <see cref="CelikNET::DocumentData">CelikNET::DocumentData</see> klase u kojoj su podaci</returns>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko ReadDocumentData nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        DocumentData^ ReadDocumentData() 
        {
            msclr::lock l(CelikInteropCleaner::singleton); // thread global sync
            int err;
            PEID_DOCUMENT_DATA p = new EID_DOCUMENT_DATA;
            if ((err = EidReadDocumentData(p)) != EID_OK) throw gcnew CelikException("ReadDocumentData nije izvrsen", err);
            DocumentData^ dd = gcnew DocumentData;
            dd->docRegNo = decodeUTF8Buffer(p->docRegNo, p->docRegNoSize);
            dd->issuingDate = decodeUTF8Buffer(p->issuingDate, p->issuingDateSize);
            dd->expiryDate = decodeUTF8Buffer(p->expiryDate, p->expiryDateSize);
            dd->issuingAuthority = decodeUTF8Buffer(p->issuingAuthority, p->issuingAuthoritySize);
            return dd;
        }


        /// <summary>
        /// Ucitava sliku sa licne karte
        /// </summary>
        /// <returns>Instanca <see cref="System::Drawing::Bitmap">System.Drawing.Bitmap</see> klase u kojoj je slika licne karte</returns>
        /// <exception cref="CelikNET::CelikException">Bacen ukoliko ReadPortrait nije prosao kako treba, kod greske je ukljucen u tekst exceptiona</exception>
        Bitmap^ ReadProfileImage() 
        {
            msclr::lock l(CelikInteropCleaner::singleton); // thread global sync
            // izvuci bajtove portreta
            int err;
            PEID_PORTRAIT p = new EID_PORTRAIT;
            if ((err = EidReadPortrait(p)) != EID_OK) throw gcnew CelikException("ReadPortrait nije izvrsen", err);
            // iskopiraj sliku u managed space
            array<byte>^ managedArray = gcnew array<byte>(p->portraitSize);
            Marshal::Copy((IntPtr)p->portrait, managedArray, 0, p->portraitSize);
            // instanciraj bitmap sa jpeg nizom
            MemoryStream^ ms = gcnew MemoryStream(managedArray);
            return gcnew Bitmap(ms);
        }

    private:
        String^ decodeUTF8Buffer(char* buffer, int length) 
        {
            array<byte>^ managedArray = gcnew array<byte>(length);
            Marshal::Copy((IntPtr)buffer, managedArray, 0, length);
            return Encoding::UTF8->GetString(managedArray, 0, length);
        }

    protected:
        !CelikInterop() 
        {
            int err;
            if ((err = EidEndRead()) != EID_OK) throw gcnew CelikException("EndRead nije izvrsen", err);
        } 
    };
}


Kod za ConsolTester Program.cs (ništa nije promenjeno)

Code:
/*  
    This file is part of CelikNET.

    CelikNET is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

    CelikNET is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with CelikNET.  If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace ConsoleTester
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.GetEncoding(1251) ;
            try
            {
                using (CelikNET.CelikInterop x = new CelikNET.CelikInterop())
                {
                    Console.WriteLine("Podaci o licnoj karti ------------------------------------------");
                    CelikNET.DocumentData d3 = x.ReadDocumentData();
                    Console.WriteLine("docRegNo: {0}", d3.docRegNo);
                    Console.WriteLine("issuingDate: {0}", d3.issuingDate);
                    Console.WriteLine("expiryDate: {0}", d3.expiryDate);
                    Console.WriteLine("issuingAuthority: {0}", d3.issuingAuthority);

                    Console.WriteLine("Fiksni podaci ------------------------------------------");
                    CelikNET.FixedPersonalData d1 = x.ReadFixedPersonalData();
                    Console.WriteLine("personalNumber: {0}", d1.personalNumber);
                    Console.WriteLine("surname: {0}", d1.surname);
                    Console.WriteLine("givenName: {0}", d1.givenName);
                    Console.WriteLine("sex: {0}", d1.sex);
                    Console.WriteLine("placeOfBirth: {0}", d1.placeOfBirth);
                    Console.WriteLine("stateOfBirth: {0}", d1.stateOfBirth);
                    Console.WriteLine("dateOfBirth: {0}", d1.dateOfBirth);
                    Console.WriteLine("communityOfBirth: {0}", d1.communityOfBirth);

                    Console.WriteLine("Variablini podaci ------------------------------------------");
                    CelikNET.VariablePersonalData d2 = x.ReadVariablePersonalData();
                    Console.WriteLine("state: {0}", d2.state);
                    Console.WriteLine("community: {0}", d2.community);
                    Console.WriteLine("place: {0}", d2.place);
                    Console.WriteLine("street: {0}", d2.street);
                    Console.WriteLine("houseNumber: {0}", d2.houseNumber);
                    Console.WriteLine("houseLetter: {0}", d2.houseLetter);
                    Console.WriteLine("entrance: {0}", d2.entrance);
                    Console.WriteLine("floor: {0}", d2.floor);
                    Console.WriteLine("apartmentNumber: {0}", d2.apartmentNumber);

                    Console.WriteLine("Slika ------------------------------------------");
                    Bitmap c = x.ReadProfileImage();
                    Console.WriteLine("Ucitana slika {0}x{1}", c.Width, c.Height);
                }
                Console.ReadLine();
            }
            catch (CelikNET.CelikException ex)
            {
                Console.WriteLine("EXCEPTION: {0} {1}", ex.EIDErrorCode, ex.EIDErrorDescriptionEn);
                Console.ReadLine();
                throw ex;
            }

        }
    }
}

Hristos Voskrese !!!
 
Odgovor na temu

DaliSte1984
Dalibor Vlado Stečešin
Programer
DAK-SOFT
Kula

Član broj: 345943
Poruke: 1
*.dynamic.vipmobile.rs.

Jabber: Djure Jaksica 27


+1 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.01.2021. u 10:24 - pre 39 meseci
Pozdrav ljudi,
pre svega da se zahvalim svima na odgovorima, dane sam proveo na ovoj temi pokusavajuci da resim implementaciju ovog apija u svoju C# aplikaciju.
Sve redom greske koje su se pojavljivale, ovde sam nasao odgovore, do one zadnje, koja nam se desava kada napravimo aplikaciju i radi kod nas na racunaru, ali kada prebacimo na drugi racunar,
izbacuje gresku
could not load file or assembly celiknet.dll or one of its dependencies. The specified module could not be found
tu sam se dosta pomucio, bilo je i ovde predloga, da se kopiraju fajlovi CelikAPI.dll i CelikNET.dll u System32 folder i SysWOW64 folder, ali i posle toga nije uspevalo, nema sta nisam probavao.
Na kraju, dosao sam do resenja pa sam se registrovao na ES samo da bih dao svoje resenje kao savet nekom drugom, da ne izgubi kao i ja dane :)
Znaci, za one koji su 5 puta iscitali sva resenja ovde ali i dalje imaju gresku
could not load file or assembly celiknet.dll or one of its dependencies. The specified module could not be found
kad prebace C# aplikaciju na drugi racunar,
pronadjite fajl sa nazivom msvcr120d.dll (jako je bitno ovo malo slovo d na kraju naziva),
fajl se nalazi u vasim folderima na racunaru na kom vam aplikacija radi bez problema i na kom ste je napravili(folderi System32 folder i SysWOW64)
taj fajl prekopirajte i iste te foldere na racunaru na kom do sad nije hteo da se pokrene program i radice.
Nadam se da ce nekom ovo pomoci.
Pozdrav
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.01.2021. u 10:39 - pre 39 meseci
To malo "d" u imenu fajla je Debug. Projekti u Visual Studiju obično dolaze u dve konfiguracije, Debug i Release. Debug se koristi dok razvijamo program, jer omogućava debagovanje. Release treba da se koristi kada program treba da se izvršava na svim drugim mašinama, jer će se brže izvršavati. Takođe, tu je i problem licence. Mikrosoft zabranjuje da se kopiraju te Debug biblioteke sa "d" u imenu. Imaš pravo da ih koristiš samo ako dolaze uz Visual Studio. Morao bi na svaku ciljnu mašinu da instaliraš i Visual Studio, da ne bi kršio zakon.

Moja preporuka je da bilduješ svoj program u Release konfiguraciji i to distribuiraš na druge mašine. Takav program koristi biblioteku bez slova "d" u imenu, koja je najverovatnije već instalirana na ciljnoj mašini, a ako i nije postoje besplatni takozvani redistributabilni paketi od Mikrosofta kojima se te biblioteke instaliraju.
 
Odgovor na temu

davor.bulic
Davor Bulić
Belgrade

Član broj: 347348
Poruke: 4
*.static.sbb.rs.



+3 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI02.08.2022. u 15:14 - pre 20 meseci
Da oživim malo ovu temu.

Na prvom mestu, hvala @mmix na podeljenom kodu, hvala i svima ostalima na korisnim komentarima.

Imao sam potrebu da izmenim ovaj dll, pa vam šaljem sada svoju verziju koda sa par izmena.

- izmenjen je CelikApi.dll na poslednju verziju koju je mup izdao ApiVersion =3, sa kojojm rade sve lične karte, i one od pre 2013. i ove najnovije.
- izmenjen je konstruktor da prima naziv čitača kartica, ako neko ima potrebu da na jednom računaru ima više čitača, ovo mu može pomoći. Imate primer u Program.cs fajlu kako se ime čitača prebacuje u sbyte*

Kod možete preuzeti: https://drive.google.com/file/...5UDIJsutSQNM1/view?usp=sharing

Pozdrav svima.





 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 403
*.dynamic.sbb.rs.



+44 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI27.10.2022. u 20:30 - pre 17 meseci
@davor.bulic ,
hvala na izmenama.
Testirao sam kod sa novim izmenama (preuzeto sa linka iznad) i kada pokrenem ConsoleTester dobijam poruku EXCEPTION: -1 General Error
Testirano je na više računara - VS 2019, zatim VS 2022 i 2015. Konfigurisano je kako je opisano u prethodnim postovima. Na drugom računaru je instaliran samo VS 2019, učitano sve default i nakon kompajliranja dobija se gore pomenuta greška.
Inače, aplikacija skinuta sa mup-ovog sajta radi, sve ovo je testirano sa 2 čitača (gemalto i omnikey) i greška se javlja uvek.
Ako neko zna u čemu je problem, mogao bi da napiše.

I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

davor.bulic
Davor Bulić
Belgrade

Član broj: 347348
Poruke: 4
*.static.sbb.rs.



+3 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI28.10.2022. u 07:46 - pre 17 meseci
Ivane,

ja sam sve radio u vs2019, jedino što mi pada na pamet da bi moglo da pravi problem je što sam ja zakucao ime mog čitača u kodu, ti treba da staviš svoj.
27. linija koda u Program.cd fajlu:
string str = "OMNIKEY AG Smart Card Reader USB 0\0";

Pozdrav
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 403
*.dynamic.sbb.rs.



+44 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI28.10.2022. u 07:57 - pre 17 meseci
To je prvo što sam uradio - izmenio sam naziv čitača, ali izgleda da nije do toga. :(
I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

davor.bulic
Davor Bulić
Belgrade

Član broj: 347348
Poruke: 4
*.static.sbb.rs.



+3 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI28.10.2022. u 08:38 - pre 17 meseci
Vidi, ostavio sam i običan konstruktor bez parametara, izmeni kod da koristi taj, da budeš siguran da nije do moje izmene.
Ako je i dalje prisutan problem, probaj onda da prečešljaš temu ispočetka, verujem da je neka sitnica koja ti je promakla.
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 403
80.93.255.*



+44 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI28.10.2022. u 10:04 - pre 17 meseci
EDIT:
Upravo sam uspeo. Navodno drajver je bio problem (koristio sam ranije WinUSB drajver za web pa je imao konflikt). Radi sve (ali bez parametra za CelikInterop. Sa parametrom ne radi).
-------------
Hvala na odgovoru.

CelikInterop() sam probao bez parametra. Takođe, izmenio CelikNET.cpp da ne koristi parametar.
Nazivi čitača su: "Gemplus USB Smart Card Reader" i drugi "Microsoft Usbccid SmartCard Reader (WUDF)". Probao sam i bez ovog Gemplus (kao što piše u Device manageru).
Javlja se isti problem. Čudno je da MUP RS aplikacija radi bez problema, a da ovde izbacuje grešku.
Takođe, u jednoj verziji CelikNET sam dodao deo koda u Program.cs gde uz .txt fajla čita naziv čitača.
Odmah nakon string str = ...
Code:
string contents = "USB SmartCard Reader";
if (File.Exists("card.txt"))
{
    contents = File.ReadAllText(@"card.txt");
    str = contents;
}

I stavio card.txt sa nazivom čitača u isti folder gde je .exe kako bih mogao da brzo testiram sa raznim čitačima.
Naravno, ni ovo ne pomaže. I dalje se javlja greška.
Već duže vreme se mlatim sa ovim :)

Dodatak:
Probao sam i da automatski nađe naziv čitača sa new SCardContext() ... context.GetReaders(); itd. ali ni to ne pomaže.
Hvala.


[Ovu poruku je menjao ivan.a dana 28.10.2022. u 11:34 GMT+1]

[Ovu poruku je menjao ivan.a dana 28.10.2022. u 13:38 GMT+1]
I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.12.2022. u 11:12 - pre 16 meseci
Ok, probudio sam se Trebalo mi je samo 12 godina
Treba mi ova biblioteka za neki WPF projekat, tako da je vreme da se malo posvetim osavremenjavanju ove biblioteke i dovodjenje iste u moderne okvire


Dakle, napravio sam repositorijum na GitLab-u, dodao osnovni sors i Davorove izmene (@davor.bulic, procitaj * primedbu na kraju)

Repo je lociran na GitLab: Mitro Celik Core

Trenutno su iskljuceni issues, i samo clanovi mogu da commituju, i (za sada) sam samo ja clan.

Faza 1, koju cu uraditi sam:

- Dodavanje targeta za .net core (sve supported LTS i intermediary releases), NETStandard 2.0 i NETFramework 4.8. Generalno release cycle ce podrzvati i pratiti MS NET Foundation support ciklus
- Dovodjenje u buildable stanje da podrzava trenutni feature-set radi lakse migracije
- Publikovanje biblioteke na NuGet
- Transfer licence sa LGPL na MIT (davore, procitaj * ). Stvari su se dosta promenile na tom polju od 2010

ideja za prvu fazu je da samo prestanete da bildujete svoju biblioteku i ukljucite NuGet paket u projekat i sve nastavi da radi (mozda ce namespace da se promeni samo).
Kad to zavrsim, squashovacu sve izmene u jedan commit u masteru i otkljucacu issues za public pristup, isto cu prihvatati pomoc ko zeli da se prikljuci, i preci cemo u pun pull-request/code review proces. Neke od stvari koje treba da se urade u fazi 2:

- CI
- CD na NuGet
- Puna async podrska
- podrska za konfiguraciju citaca i (re)inicijalizaciju biblioteke na drugom/vise citaca
- podrska za nove CelikAPI funkcije
- podrska za Dependency Injection upotrebu (interfejsi, fabrike i ta cudesa)
- podrska za x86 i x64 (dakle za AnyCPU)
- podrska za Linux, dalje podrska za ARM (ovo sve pod uslovom da ili pribavimo CelikAPI za te paltforme ili da nekako izbunarimo protokol komunikacije)
- Demo aplikacije za Console (mozda asp.net backend use), WinForms, WPF i ako izbunarimo Linux/ARM za GTK+, QT i sta god da Mac koristi.
- druge ideje?

Ako imate neki savet, primedbu, sugestiju, pisite dalje u ovoj temi.

* Primedba za Davora:
Davore, kako sto vidis, planiram da promenim licencu u MIT, posto si ti contributor pod LGPL3 licencom koja ne dozvoljava downgrading na MIT, treba mi tvoja dozvola. I treba mi tvoj email za CONTRIBUTORS fajl.

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.12.2022. u 12:34 - pre 16 meseci
Kako bi se napravila async podrška kad osnovne API funkcije nisu async? Ne vidim svrhu.

Sve ostalo podržavam.

Inače, *.suo i *.user fajlovi ne treba da idu u git.
 
Odgovor na temu

davor.bulic
Davor Bulić
Belgrade

Član broj: 347348
Poruke: 4
*.static.sbb.rs.



+3 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.12.2022. u 14:52 - pre 16 meseci
Pozdrav Miljane,
drago mi je da si rešio da se posvetiš ponovo ovome.

Hvala za stavljanje na contributors listu, ali zaista nije bilo potrebe, moj doprinos je bio minimalan.
Naravno da imaš dozvolu, što se tiče email adrese ona je na gmail-u, a domenu prethodi isto korisničko ime koje imam i ovde.

Puno uspeha!

Citat:
mmix:
Ok, probudio sam se :) Trebalo mi je samo 12 godina :)
Treba mi ova biblioteka za neki WPF projekat, tako da je vreme da se malo posvetim osavremenjavanju ove biblioteke i dovodjenje iste u moderne okvire


Dakle, napravio sam repositorijum na GitLab-u, dodao osnovni sors i Davorove izmene (@davor.bulic, procitaj * primedbu na kraju)

Repo je lociran na GitLab: Mitro Celik Core

Trenutno su iskljuceni issues, i samo clanovi mogu da commituju, i (za sada) sam samo ja clan.

Faza 1, koju cu uraditi sam:

- Dodavanje targeta za .net core (sve supported LTS i intermediary releases), NETStandard 2.0 i NETFramework 4.8. Generalno release cycle ce podrzvati i pratiti MS NET Foundation support ciklus
- Dovodjenje u buildable stanje da podrzava trenutni feature-set radi lakse migracije
- Publikovanje biblioteke na NuGet
- Transfer licence sa LGPL na MIT (davore, procitaj * :) ). Stvari su se dosta promenile na tom polju od 2010 :D

ideja za prvu fazu je da samo prestanete da bildujete svoju biblioteku i ukljucite NuGet paket u projekat i sve nastavi da radi (mozda ce namespace da se promeni samo).
Kad to zavrsim, squashovacu sve izmene u jedan commit u masteru i otkljucacu issues za public pristup, isto cu prihvatati pomoc ko zeli da se prikljuci, i preci cemo u pun pull-request/code review proces. Neke od stvari koje treba da se urade u fazi 2:

- CI
- CD na NuGet
- Puna async podrska
- podrska za konfiguraciju citaca i (re)inicijalizaciju biblioteke na drugom/vise citaca
- podrska za nove CelikAPI funkcije
- podrska za Dependency Injection upotrebu (interfejsi, fabrike i ta cudesa)
- podrska za x86 i x64 (dakle za AnyCPU)
- podrska za Linux, dalje podrska za ARM (ovo sve pod uslovom da ili pribavimo CelikAPI za te paltforme ili da nekako izbunarimo protokol komunikacije)
- Demo aplikacije za Console (mozda asp.net backend use), WinForms, WPF i ako izbunarimo Linux/ARM za GTK+, QT i sta god da Mac koristi.
- druge ideje?

Ako imate neki savet, primedbu, sugestiju, pisite dalje u ovoj temi.

* Primedba za Davora:
Davore, kako sto vidis, planiram da promenim licencu u MIT, posto si ti contributor pod LGPL3 licencom koja ne dozvoljava downgrading na MIT, treba mi tvoja dozvola. I treba mi tvoj email za CONTRIBUTORS fajl.

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI05.12.2022. u 18:08 - pre 16 meseci
Citat:
Mihajlo Cvetanović: Kako bi se napravila async podrška kad osnovne API funkcije nisu async? Ne vidim svrhu.



U principu svaki proces koji ima neki IO ili waiting period moze da se asyncuje da bi se pozivni thread oslobodio. Citanje smart card-a definitivno pada u tu kategoriju, iako je obfuscated kroz API DLL metod (koji, tacno, nije async) To je narocito vazno kod GUI aplikacija da se ne bi blokirao dispatcher i async je veoma lep mehanizam da se izbegne manuelni offloading sa dispatcher thread-a. Konkretan primer zasto bi ovo bilo dobro je recimo WPF aplikacija u situacijama kad citac ima problema sa citanjem kartice i slicno, kada waiting/retrying mzoe da potraje duze vreme tokom kojeg ce dispatcher biti blokiran.

U principu najlakse je asynovati stvari koje se oslanjaju na neki vec uradjeny async proces (npr http upit, itd), onda uradis piggy-back na postojeci async process kroz await (a tvoj metod onda bude async).
Kad je nesto sasvim novo onda si, kolokvijalno, "on the bottom of the async pile" i pravis svoju implementaciju root async task-a. Vec sam to radio za neke procese u jednom embedded sistemu. Ides kroz AsyncMethodBuilder<T> ili kroz ValueTask<T>. Koji cu/cemo tacno pristup izabrati zavisi od arhitekture biblioteke. Vec sada sam naleteo na problem da framework/msbuild i core c++ izgleda ne mogu biti u istom projektu jer jedan ne ume da napravi assembly od C++ koda za drugi, tako da cu verovatno morati da napravim dva razlicita asemblija za framework i core. Dosta se izdesavalo i na polju interopa u zadnjih 12 godina, tako da moze da se desi da uspem i da ostvarim sve sto hocu kroz interop manipulaciju, cime bih izbegao C++ generalno. Videcemo, radim na ovome koliko vreme dozvoli.


EDIT: Sad kad malo bolje razmislim, mislimda nema ni potrebe za bottom-pile poslom, mislim da je dovoljno offloadovati sync posao na worker thread i pustiti continuation u dispatcher. Videcu jos.


Odavde sam dobio ideje: SO: Implement async "yielding" the proper way

Citat:
Mihajlo Cvetanović: Inače, *.suo i *.user fajlovi ne treba da idu u git.


Hmm, pogledacu, ne bi trebalo da su tu, trebalo bi da ih je .gitignore izbacio. mozda su se provukli u working tree pre nego sto sam iskopirao gitignore.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: CelikNET: LGPL CLR Interop Wrapper za CelikAPI
(TOP topic, by mmix)
Strane: << < .. 2 3 4 5 6 7 8

[ Pregleda: 70200 | Odgovora: 147 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.