[quote=""paul79""]Ich bin gerade dabei mich in C# einzuarbeiten. Das geht auch soweit ganz gut vorwärts. Ich suiche jedoch noch einige Seiten in den weiten des Internet die für Einsteiger gut geeignet sind.[/quote]
Hast Du es schon mal mit der Doku von Visual Studio selbst probiert?
Visual Studio .NET -> Visual Basic und Visual C# -> Referenz -> Visual C#-Sprache.
Dort findet man eigentlich alles was man braucht, inklusive Beispiele. Darunter gibt es dann noch die .NET-Framework-Referenz.
Besonders hänge ich gerade dabei Funktionen einer externen DLL zu nutzen. Besonders bei der Umwandlung der Datentypen. Das es irgendwie mit DLLImport und MarshallAs geht weiß ich inzwischen, aber das Thema wird überall nur angeschnitten und leider nicht genauer behandelt.
Ist ja auch nicht immer trivial, zumindest wenn man externe DLLs mit unmanaged Code meint. Wenn Du Strukturen übergeben musst, die Zeiger beinhalten, wird es besonders schwer bis nahezu unmöglich.
Ich habe hier ein Beispiel von Windows CE. Das C#-Programm benutzt direkt die Funktionen CreateFile(), CloseHandle(), ReadFile() und WriteFile() aus der coredll. Hier die Deklaration der Konstanten und DLL-Funktionen.
Code: Alles auswählen
// CreateFileW()
internal const UInt32 METHOD_BUFFERED = 0;
internal const UInt32 METHOD_IN_DIRECT = 1;
internal const UInt32 METHOD_OUT_DIRECT = 2;
internal const UInt32 METHOD_NEITHER = 3;
internal const UInt32 FILE_ANY_ACCESS = (0 << 14);
internal const UInt32 FILE_READ_ACCESS = (1 << 14); // file & pipe
internal const UInt32 FILE_WRITE_ACCESS = (2 << 14); // file & pipe
internal const Int32 INVALID_HANDLE_VALUE = -1;
internal const UInt32 OPEN_EXISTING = 3;
[DllImport("coredll.dll", EntryPoint="CreateFileW",
SetLastError = true)]
private static extern
IntPtr CECreateFileW(String lpFileName, UInt32 dwDesiredAccess,
UInt32 dwShareMode,IntPtr lpSecurityAttributes,
UInt32 dwCreationDisposition,
UInt32 dwFlagsAndAttributes,
IntPtr hTemplateFile);
// CloseHandle()
[DllImport("coredll.dll", EntryPoint="CloseHandle",
SetLastError = true)]
private static extern
int CECloseHandle(IntPtr hObject);
// ReadFile()
[DllImport("coredll.dll", EntryPoint="ReadFile", SetLastError = true)]
private static extern
int CEReadFile(IntPtr hFile, byte[] lpBuffer,
Int32 nNumberOfBytesToRead,
out Int32 lpNumberOfBytesRead, IntPtr lpOverlapped);
// WriteFile()
[DllImport("coredll.dll", EntryPoint="WriteFile", SetLastError = true)]
private static extern
int CEWriteFile(IntPtr hFile, byte[] lpBuffer,
Int32 nNumberOfBytesToWrite,
out Int32 lpNumberOfBytesWritten, IntPtr lpOverlapped);
Aufrufen kann man das dann z.B. so:
Code: Alles auswählen
hPort = CECreateFileW(FileName, (UInt32)access, 0, IntPtr.Zero,
OPEN_EXISTING, 0, IntPtr.Zero);
if (hPort == (IntPtr)INVALID_HANDLE_VALUE)
{
throw new Exception("Can't open file");
}
Vielleicht hilft das schon ein bisschen weiter. Das Grundkonzept müsste klar sein.
Wegen der Typumwandlung beim Aufruf:
Arrays kann man direkt anstelle von Pointern übergeben, einfache Variablentypen (int, char, usw) auch. Strukturen sind wie gesagt schwierig. Pointer auch. Obwohl mein Beispiel ja schon ein paar Sachen zeigt.
Auf dem PC müsste es noch einfacher gehen, aber auf WinCE gibt es viele Marshalling-Funktionen nicht (oder erst ab Compact Framework 2.0 oder gar 3.0), da ist es richtig knifflig und muss manchmal über Bytefelder simuliert werden. Und wehe das soll dann auf einer Maschine mit anderem Byte-Ordering laufen, au weia...
Gruß,
Hagge