Ich möchte auf eine PCI-Karte zugreifen mit Read/Write bzw. In_8()/In() und Out_8()/Out(). Bisher habe ich unter C mit In_8( base_address) und Out_8 (base_address, value) gearbeitet.
Kann mir jemand einen kleinen Tipp geben, ich das mit C# mache?
Danke im Voraus.
Hallo,
möchtest du einen Treiber schreiben oder stellt der Treiber diese C Methoden zur Verfügung, die du jetzt in C# aufrufen willst?
Ich möchte selber einen Treiber für die Karte schreiben. Dazu benötige ich Funktionen, mit denen ich auf das Dual Port RAM zugreifen kann. Bei C sind in() und out() standardmäßig mit dabei (zumindest bei mir).
Ich suche also ähnliche Befehle wie in/out von C nun für C#.
Hallo,
"Treiber" in diesem Sinne kannst du nicht unter C# entwickeln - siehe dazu auch Treiber-Entwicklung
Die Grundfunktionen musst du also in C schreiben.
Verstehe ich das richtig: Ich schreibe mit C eine DLL mit den Funktionen in/out und binde diese DLL dann in mein C#-Projekt ein und dann funktionierts ??
Ja genau, allerdings nicht so einfach wie beim einbinden von .NET DLLs:
http://www.microsoft.com/germany/msdn/library/net/SoArbeitetNETMitWin32UndCOMZusammen.mspx?mfr=true
http://www.pinvoke.net/
http://msdn.microsoft.com/msdnmag/issues/01/08/interop/
http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.marshal(VS.71).aspx
Kernelmodetreiber für Win32 sind nicht gerade einfach zu programmieren.
TVicPort liefert dafür aber eine saubere Alternative über einen virtuellen Device Driver ...
Verstehe ich das richtig: Ich schreibe mit C eine DLL mit den Funktionen in/out und binde diese DLL dann in mein C#-Projekt ein und dann funktionierts ??
Sofern diese Funktionen unter Win32 ohne Probleme gearbeitet haben, sollten sie auch in C# keine Probleme machen.
Danke für eure Hilfe.
Ich habe quasi eine Dummy-DLL erstellt, die die Funktionen auf das Dual-Port-RAM ausführt. Habe mir das schwieriger vorgestellt, aber globale Variablen in der DLL bleiben erhalten und damit auch mein Zeiger auf das Dual-Port RAM. Mit einer Funktion GetInputData() brauche ich dann nur noch über den globalen Zeiger der Dummy-DLL auf die Daten zugreifen. Ich habe das mit DLLIMPORT gemacht und das funktioniert problemlos.
Nur noch eine kurze Frage: Darf man in einer DLL globale Variablen verwenden, oder ist das schlechtes Design?
Kannst du machen, aber damit verliert die DLL Multi-Threading-Fähigkeit, es sei denn, du synchronisierst den Zugriff auf die Variable. Gleiches gilt auch für statische Variablen innerhalb einer Funktion.