Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


ANSI/ISO C huvud till c#

Postades av 2005-07-07 14:37:55 - Fredrik Olsson, i forum c# (c-sharp), Tråden har 2 Kommentarer och lästs av 526 personer

Jag har ett dynamiskt länkbibliotek (I en DLL för Windows naturligtvis). Med en standard c-huvudfil till. Att skriva en simpel COM-wrapper i Visual Basic 6 var enkelt och ett effektivt sätt att låta VB- och VBScript-programmerare ta del av funktionaliteten.

Nu vill jag även låta .NET-utvecklare ha samma familjära enkelhet, men det verkar inte vara lika lätt. Jag vill skriva ett klassbibliotek i c#, och jag kan inte ändra länkbibliotekets funktion då det redan är i skarp drift.

Jag minimerar koden lite så låt oss säga att jag har detta c-huvud:

// Lite konstanter
#define NAME_LEN 16
// En välrigt enkel struktur
typedef struct {
int id;
char name[NAME_LEN + 1];
int stuff;
} session;
// Och en funktion som tar några grunargument
int login(session *sess, int orgnr, char *name);

Vad jag tänkt mig är att ha C API:t i en privat wrapper-klass i c# och anropen som statiska metoder på denna. Jag tror detta skulle dölja komplexiteten för slutanvändarna och förenkla bra för mig (Det har fungerat väl för Java, C++, Objective-C, Object Pascal, Perl och COM-wrappers som redan är skrivna iaf).

Problem #1:
#define NAME_LEN 16
Skulle kunna bli:
private const int NAME_LEN = 16;
Detta går inte att ha rakt i namnrymden. Så antingen som publik i wrapper-klassen eller som en privat enumeration i namnrymnden, vad är att föredra?

Problem #2:
Struktruren, något åt detta hållet kanske?:
[StructLayout(LayoutKind.Explicit)]
public struct session {
[FieldOffset(0)] public int id;
[FieldOffset(4)] public byte[] name = new byte[wrapperclass.NAME_LEN + 1];
[FieldOffset(24)] public int id;
}
Nu kör jag på byte då char är Unicode i c# och jag behöver LATIN1-teckenkodning. Men jag betvivlar att detta skall fungera iaf, jag antar att byte[] och new byte[...] gör en hel del automagi bakom kulisserna som är så långt ifrån ASNI/ISO C som man kan komma :). Så frågan lyder; Hur gör jag en struktur kompatibel med C i c#?

Problem #3:
Funktionsanropet, första rgumentet:
[DllImport("thelib.dll")]
public static extern int login(session* sess, int orgnr, byte *name);
Är syntaxkorrekt, men är det rätt väg? Jag har sett nyckelordet ref nämnas flera gånger, och det skulle kunna fungera lika bra här, är det en bättre metod? Jag kommer att skyffla runt denna struktur i programmet en hel del, det är ju som man kan gissa av namnet en sessions-struktur :). Så att skyffla runt en pekare verkar vettigare än att kopiera strukturen och skyffla runt på en hög data. Hur gör jag detta på ett c#-igt vis?

Problem #4:
Funtionsanropet sista argumentet:
[DllImport("thelib.dll")]
public static extern int login(session* sess, int orgnr, byte *name);
Jag gillar det inte alls! Klassen string har en metod ToCharArray, men det är Unicode och det var som jag skrev tidigare skrev inge att ha för min del. Så hur skickar jag strängar i vanlig LATIN1-teckenkodning till externa anrop i c#?

Många frågor så mpnga tack på förhand :).


Svara

Sv: ANSI/ISO C huvud till c#

Postades av 2005-07-08 15:28:33 - Fredrik Olsson

<strunt enter>


Svara

Sv: ANSI/ISO C huvud till c#

Postades av 2005-07-08 15:43:59 - Fredrik Olsson

Struntsamma jag löste det med google, och dokumenationen för Mono (http://www.mono-project.com). Så det kompilerar like fint under Visual Studio på Windows som med Mono på så gott som vilken platform som hellst.

Om det är någon annan som kan tänkas vilja göra samma sak i framtiden så kommer min lösning här:

Problem #1:
För konstanter med #define i C fungerar en intern klass bra för att samla dem, och dölja för utomstående. För mitt exempel:
internal class Constants {
public const int NAME_LEN = 16;
}

problem #2:
C strukturer kompatibla med c#, för mitt exempel funger detta utmärkt (Strukturens medlemmar är fullt kompatible med vad GCC gör):
[StructLayout(LayoutKind.Sequential)]
internal struct session {
public int id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.NAME_LEN + 1)]
public byte[] name;
public int stuff;
}

Problem #3:
Inget problem egentligen ref skall uppenbarligen användas eftersom man tvingar användaren till att använda osäker kod (Hur nu detta definieras under Win32? :)) om man använder pekare.

Problem #4:
En vektor av byte kan användas att hjälpmetoder för textkodning från System.Text. Så funktionen deklareras som:
Problem #4:
Funtionsanropet sista argumentet:
[DllImport("thelib.dll")]
public static extern int login(ref session sess, int orgnr, byte[] name);
För att fixa en enkel omvandling från en vektor med byte med LATIN1 till string, och tillbaka kan dessa två hjälpmetoder användas:
public static byte[] StringToByteA(string str) {
if (str != null) {
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
return enc.GetBytes(str);
} else {
return null;
}
}
public static string ByteAToString(byte[] bytea) {
if (bytea != null) {
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
return enc.GetString(bytea);
} else {
return null;
}
}


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 166
27 952
271 704
882
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies