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: << < .. 4 5 6 7 8 9 10

[ Pregleda: 80537 | Odgovora: 182 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI09.10.2024. u 13:44 - pre 5 meseci
Pozdrav kolege :) Nadam se da je prikladno ovo ovde da okačim, pošto ima vas dosta da vas muči podrška za celikapi 1.4.*

Već duže vreme pratim temu oko CelikNet-a (pošto posao zahteva jbg) i usled par nepogodnosti sa CelikNet rešenjem rešio sam da napravim novi paket za rad sa ličnim karticama: DirectCelik
Oslanja se na .NET Standard 1.1, odnosno podržava .NET Framework 4.5 pa na više, kao i .NET/Core verzije 1.0 pa na više.
On je efektivno wrapper za MUPov celikapi.dll. specifično je pravljen sa celikapi.dll verzijom 1.4.1, kako god morao bi da radi sa svakom 1.4.* verzijom.

Inspiracija za novi paket su prateći izazovi na koje sam naišao:
- CelikNet Ne podržava celikapi v1.4.*,
- Potencijalno baca exception u finalizeru (fatalno, bez meni jasnog načina da se izbegne ili handluje) i,
- Nije na nuget.org, niti mi nije jasno gde glavni git repozitorijum github/gitlab (više linkova po ovoj tabli, najverovatnije je glavni repo na gitlab od lika mitrocelik)

INSTALACIJA
Okačen je na nuget.org repozitorijumu, pa ga možete instalirati preko bilo kog package manager-a. u VS idite desnim klikom na projekat u koji ga želite instalirati, izaberite Manage Nuget Packages, u pod tabom Browse pretražite "DirectCelik"
Pored instalacije NuGet paketa morate dodati celikapi.dll u project output KAKO GOD, trebate da preuzmete i 32bit i 64bit verzije, i da ih preimenujete u "CelikApiX32.dll" i "CelikApiX64.dll".
Paket može da radi sa obe u zavisnosti da li vaš sistem podržava x64 ili ako je vaš projekat buildovan specifilno za x86 ili x64.

KORIŠĆENJE
Primer korišćenja možete videti u sample projektima na GitHub-u, a evo i ovde jedan sample:
Code:

using DirectCelik;

using var celik = Celik.Create();
var readers = CardReaders.Readers();
var result = celik.Execute<CardData>(readers.FirstOrDefault(), session =>
{
    var fpd = session.ReadFixedPersonalData();
    var vpd = session.ReadVariableParsonalData();
    var dd = session.ReadDocumentData();

    var image = session.ReadPortrait();
    return new CardData(
        fpd.Data.givenName,
        fpd.Data.surname,
        fpd.Data.dateOfBirth,
        vpd.Data.state,
        image.Data);
});
Console.ReadKey();

record CardData(string firstName, string lastName, string birthDate, string state, byte[] profileImage);


Treba obratiti pažnju na par stvari, DirectCelik.Celik klasa implementira IDisposable, i zato je najbolje staviti ga u using blok
Dodatno ona je efektivno singletonske prirode (tj. možete je instancirati na startup programa i dispozovati je na kraju programa), ali možete i praviti više instanci ove klase slobodno bez problema.
Celik pruža metodu T Execute<T>(string reader, Func<ICelikSession, T> function) kojim vršite čitanje podataka sa kratica.
- reader je ime čitača kartica, koje možete nabrojati iz pomoćne metode CardReaders.Readers()
- function je callback kojim vi čitate podatke sa kartice pomoću prosleđenog ICelikSession
- T je tip povratne vrednosti ove metode, odnosno prosleđene funkcije. Ako hoćete da vraća void, koristite .Execute bez generičkog parametra.

Celik klasa predstavlja lifetime celikapi biblioteke (od EidStartup, do EidCleanup)
ICelikSession, odnosno trajanje poziva .Execute metode predstavlja lifetime jednog očitavanja kartice(od EidBeginRead, do EidEndRead)
Svi response-ovi ICelikSession metoda daju informacije o status kodu vraćenom od celikapi.dll

Nadam se da će ovo pomoći bar jednom kolegi programeru :)
Dodatno ako imate zahteve, probleme sa paketom ili šta već javite.
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2997



+768 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI09.10.2024. u 19:25 - pre 5 meseci
Ako je Singleton, onda se može kreirati samo jedna instanca, svako sledeće instanciranje će vratiti postojeću instancu. Naravno, to važi unutar iste aplikacije, modula i sl., zavisi kakva je arhitektura aplikacije.
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.a1.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI09.10.2024. u 19:50 - pre 5 meseci
Citat:
mjanjic: Ako je Singleton, onda se može kreirati samo jedna instanca, svako sledeće instanciranje će vratiti postojeću instancu. Naravno, to važi unutar iste aplikacije, modula i sl., zavisi kakva je arhitektura aplikacije.

Možete je instancirati više puta - to je podržano, kako god jednako vam je efektivno da napravite jednu instancu i njom da baratate. Na kraju je bitno samo da su sve instance dispozovane. nisam mislio bukvalan singleton(i to sam jasno trebao da kažem) :)

ako bi ste koristili DI, definitivno bi je registrovao kao singleton. to sam mislio.
ali vam možda to ne odgovara u trenutnoj arhitekturi, pa prema tome možete da radite sa više instanci.
 
Odgovor na temu

Cyberghost
Software Wrangler
Full Stack Developer
S U M A D I J A

Član broj: 14674
Poruke: 822
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 07:58 - pre 5 meseci
Hvala, bas znaci. Jedino sto imam pitanje sto

Code:

"surname":"?????????","givenName":"??????????"


Ovo je ćirilica 100%, ima li nekih instrukcija kako konvertovati ili da istražujem sam

Mislim da mi za projekat cak i nece trebati ime i prezime ali nije zgoreg imati taj podatak.



Citat:
radical-delta:
Pozdrav kolege :) Nadam se da je prikladno ovo ovde da okačim, pošto ima vas dosta da vas muči podrška za celikapi 1.4.*

Već duže vreme pratim temu oko CelikNet-a (pošto posao zahteva jbg) i usled par nepogodnosti sa CelikNet rešenjem rešio sam da napravim novi paket za rad sa ličnim karticama: DirectCelik
Oslanja se na .NET Standard 1.1, odnosno podržava .NET Framework 4.5 pa na više, kao i .NET/Core verzije 1.0 pa na više.
On je efektivno wrapper za MUPov celikapi.dll. specifično je pravljen sa celikapi.dll verzijom 1.4.1, kako god morao bi da radi sa svakom 1.4.* verzijom.

Inspiracija za novi paket su prateći izazovi na koje sam naišao:
- CelikNet Ne podržava celikapi v1.4.*,
- Potencijalno baca exception u finalizeru (fatalno, bez meni jasnog načina da se izbegne ili handluje) i,
- Nije na nuget.org, niti mi nije jasno gde glavni git repozitorijum github/gitlab (više linkova po ovoj tabli, najverovatnije je glavni repo na gitlab od lika mitrocelik)

INSTALACIJA
Okačen je na nuget.org repozitorijumu, pa ga možete instalirati preko bilo kog package manager-a. u VS idite desnim klikom na projekat u koji ga želite instalirati, izaberite Manage Nuget Packages, u pod tabom Browse pretražite "DirectCelik"
Pored instalacije NuGet paketa morate dodati celikapi.dll u project output KAKO GOD, trebate da preuzmete i 32bit i 64bit verzije, i da ih preimenujete u "CelikApiX32.dll" i "CelikApiX64.dll".
Paket može da radi sa obe u zavisnosti da li vaš sistem podržava x64 ili ako je vaš projekat buildovan specifilno za x86 ili x64.

KORIŠĆENJE
Primer korišćenja možete videti u sample projektima na GitHub-u, a evo i ovde jedan sample:
Code:

using DirectCelik;

using var celik = Celik.Create();
var readers = CardReaders.Readers();
var result = celik.Execute<CardData>(readers.FirstOrDefault(), session =>
{
    var fpd = session.ReadFixedPersonalData();
    var vpd = session.ReadVariableParsonalData();
    var dd = session.ReadDocumentData();

    var image = session.ReadPortrait();
    return new CardData(
        fpd.Data.givenName,
        fpd.Data.surname,
        fpd.Data.dateOfBirth,
        vpd.Data.state,
        image.Data);
});
Console.ReadKey();

record CardData(string firstName, string lastName, string birthDate, string state, byte[] profileImage);


Treba obratiti pažnju na par stvari, DirectCelik.Celik klasa implementira IDisposable, i zato je najbolje staviti ga u using blok
Dodatno ona je efektivno singletonske prirode (tj. možete je instancirati na startup programa i dispozovati je na kraju programa), ali možete i praviti više instanci ove klase slobodno bez problema.
Celik pruža metodu T Execute<T>(string reader, Func<ICelikSession, T> function) kojim vršite čitanje podataka sa kratica.
- reader je ime čitača kartica, koje možete nabrojati iz pomoćne metode CardReaders.Readers()
- function je callback kojim vi čitate podatke sa kartice pomoću prosleđenog ICelikSession
- T je tip povratne vrednosti ove metode, odnosno prosleđene funkcije. Ako hoćete da vraća void, koristite .Execute bez generičkog parametra.

Celik klasa predstavlja lifetime celikapi biblioteke (od EidStartup, do EidCleanup)
ICelikSession, odnosno trajanje poziva .Execute metode predstavlja lifetime jednog očitavanja kartice(od EidBeginRead, do EidEndRead)
Svi response-ovi ICelikSession metoda daju informacije o status kodu vraćenom od celikapi.dll

Nadam se da će ovo pomoći bar jednom kolegi programeru :)
Dodatno ako imate zahteve, probleme sa paketom ili šta već javite.


Every program is either trivial or it contains at least one bug.
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 09:16 - pre 5 meseci
Tačno kolega, polja ime i prezime su ćirilična.
to ne bi trebalo da pravi probleme sem u konzoli (u npr. WinForms ne bi trebalo da imaš problema sa ispisivanjem ćirilice)
verujem da u konzoli možete da postavite encoding prema uzorku iz CelikNet
Console.OutputEncoding = Encoding.GetEncoding(1251)
kako god kod mene baca exception da nemam instaliran taj codepage
Uvek možete da ručno napišete metodu za konverziju stringa iz ćirilice u latinicu.
 
Odgovor na temu

Cyberghost
Software Wrangler
Full Stack Developer
S U M A D I J A

Član broj: 14674
Poruke: 822
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 09:25 - pre 5 meseci
Pusta enkodovanja, 20 godina nisam napisao komad software-a da nisam morao da radim neko babičenje oko konverzija

Ovo resava ćirilicu u konzoli. Pozdrav

Code:


Console.OutputEncoding = Encoding.GetEncoding(1251);


Every program is either trivial or it contains at least one bug.
 
Odgovor na temu

crnjak1
Radivoj Crnjak
BP

Član broj: 113662
Poruke: 92
*.cpe.vektor.net.



+2 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 19:01 - pre 5 meseci
pre svega hvala ti sto si podelio wraper. muku mucim sa novim LK vec duzi period ovo je spas majke mi.
elem ostalo mi jos samo da zatvorim sesiju ali te funkcije kao da nema pa mi treba pomoc
evo kod koji radi ucitavanje na klik
u pitanju je vb .net

pokusao sam session.Dispose() ali baca mi gresku

Private Sub btnFunkcijaLK_Click(sender As Object, e As EventArgs) Handles btnFunkcijaLK.Click
Try
' Kreiranje instance Celik API-a
Using celikLifetime As Celik = Celik.Create()

' Provera da li postoje dostupni čitači
Dim reader = CardReaders.Readers()?.FirstOrDefault()

If reader Is Nothing Then
MessageBox.Show("Čitač kartica nije pronađen.")
Return
End If

' Izvršavanje sesije za čitanje podataka sa kartice
Try
celikLifetime.Execute(reader, Function(session)
' Proveri podatke i pročitaj ih
Dim idDocumentData = session.ReadDocumentData()
Dim fixedPersonalData = session.ReadFixedPersonalData()
Dim variablePersonalData = session.ReadVariableParsonalData()

' Provera da li je čitanje podataka uspešno
If fixedPersonalData Is Nothing Then
MessageBox.Show("Nije moguće pročitati lične podatke sa kartice.")
Return False
End If

' Proveri da li je vrednost "ID", i zameni je sa "LIČNA KARTA"
If idDocumentData.Data.documentType = "ID" Then
txtDocType.Text = "LIČNA KARTA"
Else
txtDocType.Text = idDocumentData.Data.documentType
End If

' Popunjavanje ostalih polja sa pročitanim podacima
txtdocRegNo.Text = idDocumentData.Data.docRegNo
txtissuingAuthority.Text = idDocumentData.Data.issuingAuthority
txtPersonalNumber.Text = fixedPersonalData.Data.personalNumber
txtgivenName.Text = fixedPersonalData.Data.givenName
txtsurname.Text = fixedPersonalData.Data.surname
txtParentGivenName.Text = LatinicaUCirilicu(fixedPersonalData.Data.parentGivenName) ' Konvertujemo u ćirilicu
DatetxtdateOfBirth.Text = fixedPersonalData.Data.dateOfBirth
txtStreet.Text = LatinicaUCirilicu(variablePersonalData.Data.street)
txthouseNumber.Text = variablePersonalData.Data.houseNumber
txtPlace.Text = LatinicaUCirilicu(variablePersonalData.Data.place)
txtcomunity.Text = LatinicaUCirilicu(variablePersonalData.Data.community)



Return True ' Povratak vrednosti iz sesije
End Function)
Catch ex As Exception
MessageBox.Show("Greška prilikom čitanja lične karte: " & ex.Message)
End Try
End Using
Catch ex As Exception
MessageBox.Show("Greška prilikom čitanja lične karte: " & ex.Message)
End Try

End Sub

takodje ko se muči sa cirilicom latinocom evo takodje funkcije koja to bar meni resava.


' Kreiranje funkcije za konverziju latinice u ćirilicu sa podrškom za digrafe
Private Function LatinicaUCirilicu(text As String) As String
' Definisanje mapiranja za digrafe
Dim digraphs As New Dictionary(Of String, String) From {
{"Dž", "Dž"},
{"dž", "dž"},
{"Lj", "Lj"},
{"lj", "lj"},
{"Nj", "Nj"},
{"nj", "nj"}
}

' Definisanje mapiranja za pojedinačne karaktere
Dim singleMap As New Dictionary(Of String, String) From {
{"A", "A"}, {"B", "B"}, {"V", "V"}, {"G", "G"}, {"D", "D"}, {"Đ", "Đ"},
{"E", "E"}, {"Ž", "Ž"}, {"Z", "Z"}, {"I", "I"}, {"J", "J"}, {"K", "K"},
{"L", "L"}, {"M", "M"}, {"N", "N"}, {"O", "O"}, {"P", "P"}, {"R", "R"},
{"S", "S"}, {"T", "T"}, {"Ć", "Ć"}, {"U", "U"}, {"F", "F"}, {"H", "H"},
{"C", "C"}, {"Č", "Č"},
{"a", "a"}, {"b", "b"}, {"v", "v"}, {"g", "g"}, {"d", "d"}, {"đ", "đ"},
{"e", "e"}, {"ž", "ž"}, {"z", "z"}, {"i", "i"}, {"j", "j"}, {"k", "k"},
{"l", "l"}, {"m", "m"}, {"n", "n"}, {"o", "o"}, {"p", "p"}, {"r", "r"},
{"s", "s"}, {"t", "t"}, {"ć", "ć"}, {"u", "u"}, {"f", "f"}, {"h", "h"},
{"c", "c"}, {"č", "č"}
}

' Prvo zameni digrafe
For Each pair In digraphs
text = text.Replace(pair.Key, pair.Value)
Next

' Sada zameni pojedinačne karaktere
Dim rezultat As New System.Text.StringBuilder(text.Length)

For Each karakter As Char In text
Dim s As String = karakter.ToString()
If singleMap.ContainsKey(s) Then
rezultat.Append(singleMap(s))
Else
rezultat.Append(s)
End If
Next

Return rezultat.ToString()
End Function
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 20:27 - pre 5 meseci
Pozdrav,
Ako sam dobro razumeo, pokušavaš ručno da dispozuješ sesiju? ICelikSession ne treba sami da disposujete, sesija se zatvara automatski na kraju .Execute(...) metode, zbog čega i sam ICelikSession ne nasleđuje od IDisposable, već samo njegova interna implementacija.
Odnosno, vi brinete samo za DirectCelik.Celik da se dispozuje, ICelikSession "Traje" koliko i .Execute metoda.
Ako nisam dobro razumeo, jel bi mogao da mi kažeš gde tačno u kodu puca i šta je exception, tj koji je message i callstack i šta već.
 
Odgovor na temu

crnjak1
Radivoj Crnjak
BP

Član broj: 113662
Poruke: 92
*.cpe.vektor.net.



+2 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 20:34 - pre 5 meseci
kao prvo ucita sve podatke i ubaci lepo u polja to je sve ok, medjutim kada hocu da ucitam sledecu licnu kartu bez zatvaranja aplikacije izbaci gresku Session is already in progress.
Problem nastaje samo kada hocu drugu licnu kartu posle prve da ocitam bez zatvaranja aplikacije dakle sto bi rekli jednu za drugom.
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 21:17 - pre 5 meseci
Pogledao sam, čudno se ponašao oko sesija kad sam testirao u VB, kako god mislim da sam ga naterao da se ponaša sa v4.1.0
Javi kad stigneš da istestiraš.
 
Odgovor na temu

crnjak1
Radivoj Crnjak
BP

Član broj: 113662
Poruke: 92
*.cpe.vektor.net.



+2 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 21:25 - pre 5 meseci
radi kao pravi sada
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI14.10.2024. u 21:38 - pre 5 meseci
Odlično kolega :)
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI16.10.2024. u 17:26 - pre 5 meseci
Pozdrav kolege još jednom.

Objavio sam DirectCelik v5.0.3 na nuget.org, i rekao bih da sam završio sa aktivnim razvojom NuGet paketa, naravno baviću se njim ako mi prijavite mane sa projektom, ili MUP izbaci celikapi.dll 1.5.*

Ima četiri izmene javnog interfejsa i to su:
- Dodao sam dve statične metode nad DirectCelik.Celik klasom, ExecuteStatic i ExecuteStatic<T> Rade isto što i DirectCelik.Celik metode Execute i Execute<T> samo što u sebi naprave i dispozuju DirectCelik.Celik klasu, i nad njom pozovu Execute, odnosno Execute<T> (i njoj prosleđuju argumente)
- Sada su rezultati operacija EIDStartup, EIDCleanup, EIDBeginRead, EIDEndRead dostupni kroz javni interfejs. EIDBeginRead je već bio, kao property interfejsa ICelikSession. Rezultat EIDEndRead operacije sada vraćaju .Execute metode. Ranije su vraćale void ili T, sad vraćaju Result ili Result<T>
- Ako je instanca Celik klase izvršila EIDStartup, onda je rezultat operacije dostupan kao property te klase StartupResult (ako nije onda je null), Ako je disposovanjem pozvala EIDEndRead, onda rezultatu možete pristupiti preko propertija CleanupResult (ako nije onda je null)
- Dodata comment dokumentacija u paket.
- Ako nije uspešno učitan ni jedan celikapi.dll, Celik.Create() baciti System.Exception("No appropriate celikapi.dll. both CelikApiX32.dll and CelikApiX64.dll should be located in the project output!")
Pa ljudi mislim da je to to za sada.

[Ovu poruku je menjao radical-delta dana 16.10.2024. u 19:06 GMT+1]
 
Odgovor na temu

Cyberghost
Software Wrangler
Full Stack Developer
S U M A D I J A

Član broj: 14674
Poruke: 822
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI18.10.2024. u 08:36 - pre 5 meseci
Dobar dan,

jedna mala konsultacija. Koristim poslednju verziju sa NuGet-a
Radi lakseg citanja sastavio sam ovaj kod

Code:

 var reader = CardReaders.Readers()?.FirstOrDefault();
 var celikLifetime = Celik.Create();
 celikLifetime.Execute(reader, session =>
 {
     rezultat = JsonConvert.SerializeObject(session.ReadFixedPersonalData()).ToString();
     File.AppendAllText("rez.txt", rezultat);
 });
 celikLifetime.Dispose();


Ovo radi kada pozovem direktno.

Problem nastaje sto ja pravim .DLL koji koristi UnmanagedCallersOnly ( da ne ulazim dublje u razloge )
Kada pozovem DLL funkciju koja zatom pozove ovaj Code odozgo ne dobijem rezultat, nema greske, TXT fajl bude prazan.

Nisam siguran da li je ovaj nacin poziva dozvoljen i sa koje strane da mu pridjem u resavanje?
Sve ostale funkcije koje rade obradu podataka i slicno rade korektno i vracaju rezultat uredno.



Citat:
radical-delta: Pozdrav kolege još jednom.

Objavio sam DirectCelik v5.0.3 na nuget.org, i rekao bih da sam završio sa aktivnim razvojom NuGet paketa, naravno baviću se njim ako mi prijavite mane sa projektom, ili MUP izbaci celikapi.dll 1.5.*

Ima četiri izmene javnog interfejsa i to su:
- Dodao sam dve statične metode nad DirectCelik.Celik klasom, ExecuteStatic i ExecuteStatic<T> Rade isto što i DirectCelik.Celik metode Execute i Execute<T> samo što u sebi naprave i dispozuju DirectCelik.Celik klasu, i nad njom pozovu Execute, odnosno Execute<T> (i njoj prosleđuju argumente)
- Sada su rezultati operacija EIDStartup, EIDCleanup, EIDBeginRead, EIDEndRead dostupni kroz javni interfejs. EIDBeginRead je već bio, kao property interfejsa ICelikSession. Rezultat EIDEndRead operacije sada vraćaju .Execute metode. Ranije su vraćale void ili T, sad vraćaju Result ili Result<T>
- Ako je instanca Celik klase izvršila EIDStartup, onda je rezultat operacije dostupan kao property te klase StartupResult (ako nije onda je null), Ako je disposovanjem pozvala EIDEndRead, onda rezultatu možete pristupiti preko propertija CleanupResult (ako nije onda je null)
- Dodata comment dokumentacija u paket.
- Ako nije uspešno učitan ni jedan celikapi.dll, Celik.Create() baciti System.Exception("No appropriate celikapi.dll. both CelikApiX32.dll and CelikApiX64.dll should be located in the project output!")
Pa ljudi mislim da je to to za sada.

[Ovu poruku je menjao radical-delta dana 16.10.2024. u 19:06 GMT+1]

Every program is either trivial or it contains at least one bug.
 
Odgovor na temu

Cyberghost
Software Wrangler
Full Stack Developer
S U M A D I J A

Član broj: 14674
Poruke: 822
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI18.10.2024. u 08:38 - pre 5 meseci
Dobar dan,

jedna mala konsultacija. Koristim poslednju verziju sa NuGet-a v5.0.3
Radi lakseg citanja sastavio sam ovaj kod

Code:

 var reader = CardReaders.Readers()?.FirstOrDefault();
 var celikLifetime = Celik.Create();
 celikLifetime.Execute(reader, session =>
 {
     rezultat = JsonConvert.SerializeObject(session.ReadFixedPersonalData()).ToString();
     File.AppendAllText("rez.txt", rezultat);
 });
 celikLifetime.Dispose();


Ovo radi kada pozovem direktno iz c sharp.

Problem nastaje sto ja pravim .DLL koji koristi UnmanagedCallersOnly ( da ne ulazim dublje u razloge )
Kada pozovem DLL funkciju koja zatom pozove ovaj Code odozgo ne dobijem rezultat, nema greske, TXT fajl bude prazan.
Citac definitivno odradi svoje po statusu lampice.

Nisam siguran da li je ovaj nacin poziva dozvoljen i sa koje strane da mu pridjem u resavanje?
Sve ostale funkcije koje rade obradu podataka i slicno rade korektno i vracaju rezultat uredno.



Citat:
radical-delta: Pozdrav kolege još jednom.

Objavio sam DirectCelik v5.0.3 na nuget.org, i rekao bih da sam završio sa aktivnim razvojom NuGet paketa, naravno baviću se njim ako mi prijavite mane sa projektom, ili MUP izbaci celikapi.dll 1.5.*

Ima četiri izmene javnog interfejsa i to su:
- Dodao sam dve statične metode nad DirectCelik.Celik klasom, ExecuteStatic i ExecuteStatic<T> Rade isto što i DirectCelik.Celik metode Execute i Execute<T> samo što u sebi naprave i dispozuju DirectCelik.Celik klasu, i nad njom pozovu Execute, odnosno Execute<T> (i njoj prosleđuju argumente)
- Sada su rezultati operacija EIDStartup, EIDCleanup, EIDBeginRead, EIDEndRead dostupni kroz javni interfejs. EIDBeginRead je već bio, kao property interfejsa ICelikSession. Rezultat EIDEndRead operacije sada vraćaju .Execute metode. Ranije su vraćale void ili T, sad vraćaju Result ili Result<T>
- Ako je instanca Celik klase izvršila EIDStartup, onda je rezultat operacije dostupan kao property te klase StartupResult (ako nije onda je null), Ako je disposovanjem pozvala EIDEndRead, onda rezultatu možete pristupiti preko propertija CleanupResult (ako nije onda je null)
- Dodata comment dokumentacija u paket.
- Ako nije uspešno učitan ni jedan celikapi.dll, Celik.Create() baciti System.Exception("No appropriate celikapi.dll. both CelikApiX32.dll and CelikApiX64.dll should be located in the project output!")
Pa ljudi mislim da je to to za sada.

[Ovu poruku je menjao radical-delta dana 16.10.2024. u 19:06 GMT+1]

Every program is either trivial or it contains at least one bug.
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.a1.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI18.10.2024. u 09:10 - pre 5 meseci
Pozdrav kolega, pogledaću večeras, javljam ako imam dodatna pitanja
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
195.46.53.*



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI18.10.2024. u 14:28 - pre 5 meseci
Pozdrav kolega, pokušao sam da rekreiram vaš problem, i nisam uspeo - odnosno informacije su korektno upisane u ciljani fajl.
evo koda koji sam koristio:
Code:

using System.Runtime.InteropServices;
using DirectCelik;
using Newtonsoft.Json;
unsafe
{
    Native.InvokeCallback(&Fn);
}

static void Fn()
{
    var reader = CardReaders.Readers()?.FirstOrDefault();
    var celikLifetime = Celik.Create();
    celikLifetime.Execute(reader, session =>
    {
        var rezultat = JsonConvert.SerializeObject(session.ReadFixedPersonalData()).ToString();
        File.AppendAllText("text.txt", rezultat);
    });
    celikLifetime.Dispose();
}

class Native
{
    [DllImport("InvokeCallback", CallingConvention = CallingConvention.Cdecl)]
    public unsafe static extern void InvokeCallback(delegate*<void> callback);
}

i C++ implementacija:
Code:

extern "C"
_declspec(dllexport)
void _cdecl InvokeCallback(void(_cdecl*pfn)())
{
    pfn();
}


Ako ovo ne predstavlja vaš slučaj, molim da mi dostavite najmanji uzorak koda kojim možete da reprodukujete ovaj bug.
 
Odgovor na temu

Cyberghost
Software Wrangler
Full Stack Developer
S U M A D I J A

Član broj: 14674
Poruke: 822
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI18.10.2024. u 17:15 - pre 5 meseci
Evo celog koda

DLL

Code:

using DirectCelik;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

public class LkDll
{   
     // ovo radi
    [UnmanagedCallersOnly(EntryPoint = "saberi")]
    public static int Saberi(int a, int b)
    {
        return (a + b);
    }
    

     // ovo ne radi
    [UnmanagedCallersOnly(EntryPoint = "lk")]
    public static IntPtr Lk()
    {
        string rezultat = "";
        IntPtr pResult;

        var reader = CardReaders.Readers()?.FirstOrDefault();
        var celikLifetime = Celik.Create();
        File.AppendAllText("rez.txt", reader.ToString() + "\n");

        celikLifetime.Execute(reader, session =>
        {
            rezultat = JsonConvert.SerializeObject(session.ReadFixedPersonalData()).ToString();
            File.AppendAllText("rez.txt", rezultat + "\n"); // <<< upise {}
        });
        celikLifetime.Dispose();

        pResult = Marshal.StringToHGlobalAnsi(rezultat);
        //Marshal.FreeHGlobal(pResult);

        return pResult;
    }
}


posto ce se DLL koristiti u XBase++ jedini nacin da ucita napisani dll je ovaj i u testu sabiranja radi i u XBase i u c# napisanom dole


Ovako pozivam za test iz c#

Code:

public class ExternalLibrary
{
 [DllImport("LkDll.dll", EntryPoint = "saberi", CallingConvention = CallingConvention.StdCall)]
 public static extern int saberi(int a, int b);

 [DllImport("LkDll.dll", EntryPoint = "lk", CallingConvention = CallingConvention.StdCall)]
 public static extern IntPtr Lk();
}

 static void Main(string[] args)
 {
     int rez = ExternalLibrary.Saberi(10, 20);
     Console.WriteLine($"Sabireanje: {rez}"); // << radi
    

     ExternalLibrary.Lk(); // ne koristim nista od podataka, cekam da se popuni TXT fajl pa kasnije ovde obradjujem 
}
 



rez.txt dobije kao sto sam napisao samo {}
Kao da ne saceka da se iscita licna karta
Direktno koriscenje iste funkcije u c# kao console app radi perfektno.



Citat:
radical-delta: Pozdrav kolega, pokušao sam da rekreiram vaš problem, i nisam uspeo - odnosno informacije su korektno upisane u ciljani fajl.
evo koda koji sam koristio:
Code:

using System.Runtime.InteropServices;
using DirectCelik;
using Newtonsoft.Json;
unsafe
{
    Native.InvokeCallback(&Fn);
}

static void Fn()
{
    var reader = CardReaders.Readers()?.FirstOrDefault();
    var celikLifetime = Celik.Create();
    celikLifetime.Execute(reader, session =>
    {
        var rezultat = JsonConvert.SerializeObject(session.ReadFixedPersonalData()).ToString();
        File.AppendAllText("text.txt", rezultat);
    });
    celikLifetime.Dispose();
}

class Native
{
    [DllImport("InvokeCallback", CallingConvention = CallingConvention.Cdecl)]
    public unsafe static extern void InvokeCallback(delegate*<void> callback);
}

i C++ implementacija:
Code:

extern "C"
_declspec(dllexport)
void _cdecl InvokeCallback(void(_cdecl*pfn)())
{
    pfn();
}


Ako ovo ne predstavlja vaš slučaj, molim da mi dostavite najmanji uzorak koda kojim možete da reprodukujete ovaj bug.

Every program is either trivial or it contains at least one bug.
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI20.10.2024. u 08:34 - pre 5 meseci
Nisam uspeo da pozovem DLL metode preko te implementacije, ne može da nađe entry points ni za lk ni za saberi (proverio sam da je DLL na istom mestu gde je i EXE)
Nisam koristio UnmanagedCallersOnly, ali kada sam radio DUMPBIN /EXPORTS TestDll.dll, ne izlista mi ni jedan entry point (jel tako treba?).

Kako god, ovako mi je radilo bez problema (moj TestDll je isti kao tvoj LkDll) + Project Reference na TestDll iz exe projekta

Code:

unsafe
{
    delegate* unmanaged<int, int, int> sab = &TestDll.Saberi;
    delegate* unmanaged<nint> lk = &TestDll.Lk;
    int rez = sab(10, 20);
    lk();
}


Treba u glavni projekat da se doda project reference na LkDll, pa direktno mozes koristiti TestDll klasu iz TestDll projekta.

Naredno isto radi, ako ti unsafe ne odgovara:
DLL:
Code:
using DirectCelik;
using Newtonsoft.Json;
using System.Runtime.InteropServices;

public class TestDll
{
    // ovo radi
    [UnmanagedCallersOnly(EntryPoint = "saberi")]
    public static int Saberi(int a, int b) => SaberiManaged(a, b);
    
    public static int SaberiManaged(int a, int b) => a + b;

    // ovo ne radi
    [UnmanagedCallersOnly(EntryPoint = "lk")]
    public static IntPtr Lk() => LkManaged();

    public static IntPtr LkManaged()
    {
        string rezultat = "";
        IntPtr pResult;

        var reader = CardReaders.Readers()?.FirstOrDefault();
        var celikLifetime = Celik.Create();
        File.AppendAllText("rez.txt", reader.ToString() + "\n");

        celikLifetime.Execute(reader, session =>
        {
            rezultat = JsonConvert.SerializeObject(session.ReadFixedPersonalData()).ToString();
            File.AppendAllText("rez.txt", rezultat + "\n"); // <<< upise {}
        });
        celikLifetime.Dispose();

        pResult = Marshal.StringToHGlobalAnsi(rezultat);
        //Marshal.FreeHGlobal(pResult);

        return pResult;
    }
}


EXE Program.cs:
Code:
int rez = TestDll.SaberiManaged(10, 20);
TestDll.LkManaged();
 
Odgovor na temu

radical-delta

Član broj: 349059
Poruke: 12
*.dynamic.isp.telekom.rs.



+6 Profil

icon Re: CelikNET: LGPL CLR Interop Wrapper za CelikAPI20.10.2024. u 08:51 - pre 5 meseci
Isto bi dodao da JsonConvert.SerializeObject(session.ReadFixedPersonalData()); ni u jednom slučaju ne bi trebao da proizvede '{}' - Metoda vraća Result<FixedPersonalData>, što znači da bi morao da sadrži 'ErrorCode' (u vidu integer), 'Success' (boolean) i 'Data' (object).
Pa da mi prema tome liči da se Newtonsoft Json ne ponaša lepo (Opet, ovo sa '{}' nisam uspeo da reprodukujem, ovo kažem na osnovu tvoje prijave)
 
Odgovor na temu

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

[ Pregleda: 80537 | Odgovora: 182 ] > FB > Twit

Postavi temu Odgovori

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