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
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.
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.
Hi.
Ich hab jetzt das gleiche Problem. Könntest du vielleicht veraten, wie du das Problem gelöst hast?
Gruß
Taner
Ich verwendete eine neuere Version der dll. Dann hats geklappt.
Wo genau der Fehler in der alten Version lag, kann ich die nicht sagen.
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!