Fehler bei Strukt und dll-Import treibt mich in den Wahnsinn


D12

Mitglied
Hi All,

ich kniffel hier mit einem Treiber rum, der mir nur ein paar Werte von einer I/O Karte ausgeben soll. Mein Problem ist der Umgang mit STRUCT und ZEIGERN, beides habe ich unter C# noch nie verwendet, finde aber auch nichts sinnvolles in meinen Büchern oder Online.

Vielleicht kann mir hier einer sagen wie ich das hinbekomme.

Fehler sind im Quellcode farbig markiert. Fehlermeldungen stehen unter dem Quellcode.

Danke & Salü
D12



Code:
using System;
using System.Runtime.InteropServices; 
namespace EBRU_API_IMPORT
{
  public struct PCIDIOALLCHANNELS
  {
    public uint Basis;
    public uint Extension;
  }

  class API_import
  {	
    //*** importierte Funktion aus der WIN API von EBRU
    [DllImport("PCIDIO.DLL")]//*** lesen der I/O-Karte
    public static extern bool pcidioDIGetState(
        Byte BoardNumber, PCIDIOALLCHANNELS*  ChannelState);

    static void Main(string[] args)
    {
      unsafe
      {    			
        PCIDIOALLCHANNELS* x;
        (*x).Basis = 0;
        (*x).Extension = 0;
        pcidioDIGetState(0, x);
      }
    }
  }
}

Fehler1:
error CS0214: Zeiger können nur in einem nicht sicheren Kontext verwendet werden
Fehler2:
error CS0165: Verwendung von möglicherweise nicht zugewiesenen lokalen Variablen 'x'
 
Zuletzt bearbeitet:

Norbert Eder

Erfahrenes Mitglied
Eigentlich müsste das ohne Pointer funktionieren.

Ich hab mir das ganze jetzt mal in eine Testklasse gepackt, kanns allerdings net testen, weil ich die entsprechende DLL nicht hab. Schaus dir mal an und teste das dann so.
Code:
using System;
using System.Runtime.InteropServices; 

namespace WindowsApplication1
{
	public struct PCIDIOALLCHANNELS
	{
		public uint Basis;
		public uint Extension;
	}

	class Class1
	{	
		//*** importierte Funktion aus der WIN API von EBRU
		[DllImport("PCIDIO.DLL")]//*** lesen der I/O-Karte
		public static extern bool pcidioDIGetState(
			Byte BoardNumber, PCIDIOALLCHANNELS ChannelState);

		public static void Init()
		{
			    			
				PCIDIOALLCHANNELS x;
				x.Basis = 0;
				x.Extension = 0;
				pcidioDIGetState(0, x);
			
		}
	}
}
Sollte es nicht klappen, empfehle ich dir die Lektüre des nachfolgenden Linkes, da ist alles drin was du brauchst:
http://msdn.microsoft.com/msdnmag/issues/03/07/NET/