Laden...

Runtime Error 217 beim beenden...

Erstellt von Beni vor 17 Jahren Letzter Beitrag vor 16 Jahren 2.309 Views
B
Beni Themenstarter:in
4 Beiträge seit 2007
vor 17 Jahren
Runtime Error 217 beim beenden...

Hallo Zusammen,

habe folgendes Problem: Rufe über PInvoke Methoden einer Dll auf. Alles funktioniert wunderbar ausser, dass ich beim Beenden des Programmes immer ein "Runtime Error 217" erhalte. Sobald ich die DLL-Mehoden auskommentiere funktioniert alles ohne error.

Hier der vereinfachte Code:

 using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
           
            USBBoard.OpenDevice(3);
            USBBoard.SetDigitalChannel(1);
            USBBoard.CloseDevice(3);
            Console.ReadLine();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace ConsoleApplication3
{
    class USBBoard
    {
        [DllImport("K8055D.dll")]
        public extern static Int32 OpenDevice(Int32 CardAddress);

        [DllImport("K8055D.dll")]
        public extern static void SetDigitalChannel(Int32 Channel);

        [DllImport("K8055D.dll")]
        public extern static void ClearAllDigital();

        [DllImport("K8055D.dll")]
        public extern static void CloseDevice(Int32 CardAdress);
    }
}

Muss ich die DLL beim Beenden irgendwie freigeben?

Vielen Dank

Beni

M
1.439 Beiträge seit 2005
vor 17 Jahren

Nein, eigentlich nicht. Erstell mal ein kleines C Programm mit der gleichen Funktionalität. Wenn hier auch ein Fehler auftritt, liegt es an deiner Dll. Wenn nicht, dann poste mal das Header-File mit den relevanten Funktionsdeklarationen.

B
Beni Themenstarter:in
4 Beiträge seit 2007
vor 17 Jahren

Nein, an der dll kanns nicht liegen, da in visual c++ oder so alles funktioniert.

Hier das h file:

typedef long (CALLBACK* LONG2LONG)(long);
typedef void (CALLBACK* VOID2VOID)(void);
typedef void (CALLBACK* LONGPLONGP2VOID)(long *, long *);
typedef void (CALLBACK* LONGLONG2VOID)(long, long);
typedef void (CALLBACK* LONG2VOID)(long);
typedef bool (CALLBACK* LONG2BOOL)(long);
typedef long (CALLBACK* VOID2LONG)(void);

class k8055d
{
public:
	k8055d(void);
	~k8055d(void);
	long  init(void);
	long  OpenDevice(long CardAddress);
	void  CloseDevice();
	long  ReadAnalogChannel(long Channel);
	void  ReadAllAnalog(long *Data1, long *Data2);
	void  OutputAnalogChannel(long Channel, long Data);
	void  OutputAllAnalog(long Data1, long Data2);
	void  ClearAnalogChannel(long Channel); 
	void  ClearAllAnalog();
	void  SetAnalogChannel(long Channel); 
	void  SetAllAnalog();
	void  WriteAllDigital(long Data);
	void  ClearDigitalChannel(long Channel);
	void  ClearAllDigital();
	void  SetDigitalChannel(long Channel);
	void  SetAllDigital();
	bool  ReadDigitalChannel(long Channel);
	long  ReadAllDigital();
	long  ReadCounter(long CounterNr);
	void  ResetCounter(long CounterNr);
	void  SetCounterDebounceTime(long CounterNr, long DebounceTime);
	
	bool  dout1;
	bool  dout2;
	bool  dout3;
	bool  dout4;
	bool  dout5;
	bool  dout6;
	bool  dout7;
	bool  dout8;

	bool  din1;
	bool  din2;
	bool  din3;
	bool  din4;
	bool  din5;

	long  da1;
	long  da2;
	long  ad1;
	long  ad2;

	long  ct1;
	long  ct2;
	long  dbct1;
	long  dbct2;

private:
	bool initialized;
	HINSTANCE hDLL;
	LONG2LONG		pOpenDevice;
	VOID2VOID		pCloseDevice;
	LONG2LONG		pReadAnalogChannel;
	LONGPLONGP2VOID pReadAllAnalog;
	LONGLONG2VOID	pOutputAnalogChannel;
	LONGLONG2VOID	pOutputAllAnalog;
	LONG2VOID		pClearAnalogChannel;
	VOID2VOID		pClearAllAnalog;
	LONG2VOID		pSetAnalogChannel;
	VOID2VOID		pSetAllAnalog;
	LONG2VOID		pWriteAllDigital;
	LONG2VOID		pClearDigitalChannel;
	VOID2VOID		pClearAllDigital;
	LONG2VOID		pSetDigitalChannel;
	VOID2VOID		pSetAllDigital;
	LONG2BOOL		pReadDigitalChannel;
	VOID2LONG		pReadAllDigital;
	LONG2LONG		pReadCounter;
	LONG2VOID		pResetCounter;
	LONGLONG2VOID	pSetCounterDebounceTime;
};

Vielen Dank für deine Hilfe.

B
Beni Themenstarter:in
4 Beiträge seit 2007
vor 17 Jahren

Ich habs raus... es lag tatsächlich an der dll...

Danke trotzdem

Beni

R
6 Beiträge seit 2007
vor 16 Jahren

Hi.
Ich hab jetzt das gleiche Problem. Könntest du vielleicht veraten, wie du das Problem gelöst hast?

Gruß
Taner

B
Beni Themenstarter:in
4 Beiträge seit 2007
vor 16 Jahren

Ich verwendete eine neuere Version der dll. Dann hats geklappt.
Wo genau der Fehler in der alten Version lag, kann ich die nicht sagen.

R
6 Beiträge seit 2007
vor 16 Jahren

danke für die schnelle Antwort.

Auch mit dieser Version
http://www.users.fh-sbg.ac.at/~kschuste/vellemann.php

der k8055D.dll.Datei, die extra für c# neugeschrieben worden ist, erhalte ich den Fehler. Der Fehler taucht ja nur beim debuggen auf, nicht in der Build-Version, aber gut ist das sicher nicht!