Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

...

General description

Die The CIFX -API baut auf einer nativen API is based on a native C / C ++ Bibliothek auf. Bibliotheken für andere Entwicklungs- und/oder Laufzeit-Umgebungen gibt es nicht.
Um aus einer .NET-Applikation heraus auf solche, so genannten "nicht verwaltete" Bibliotheken bzw. Funktionen zuzugreifen, kann das so genannte P/Invoke-Framework implementiert werden.

Diese Application Note beschreibt die Herangehensweise bei der Verwendung des P/Invoke-Frameworks, im Hinblick auf die Nutzung der CIFX-API.

Dabei bezieht sich sie sich im wesentlichen auf die Umsetzungen in den Beispielen.library. There are no libraries for other development and / or runtime environments.
In order to access such "unmanaged" libraries or functions from a .NET application, the so-called P/Invoke framework can be implemented.


This application note describes the approach when using the P/Invoke framework with regard to the use of the CIFX API.

It essentially relates to the example implemetations.

Examples are available here:

Application Examples

Code Block
[DllImport("cifx32dll.dll", EntryPoint = "<native-function-name>")] 

private static extern UInt32 _myFunction( ... );

...

CIFX API

Handles

Wie auch bei der Verwendung der Like when using the CIFX-API mit with C / C ++ ist die Handhabung verschiedener Handles erforderlich.Dazu werden Pointer an die entsprechenden Funktions-Parameter übergeben, working with different handles is necessary.

Therefore pointers are transferred to the corresponding function parameters.


In der .NET-Welt ist das mangels Verfügbarkeit von Pointern im klassichen Sinne nicht möglich.

Das P/Invoke-Framework stellt für diesen Zweck die Datentypen IntPtr bzw. UIntPtr zur Verfügung die innerhalb des "managed" Kontext einer .NET-Anwendung einen Pointer repräsentieren.

Ebenso wie bei einer Applikation die .NET this is not possible, since no pointers are available.

For this purpose, the P / Invoke framework provides the data types IntPtr and UIntPtr, which represents a pointer within the "managed" context of a .NET application.

As with an application implemented in C / C ++ implementiert ist, müssen die Handles über die Open-Funktionen der CIFX-API geöffnet werden und während der Laufzeit der Applikation weiterexistieren (Garbage Collection).

Vor Beenden der Applikatin, sollten die Handles über die entsprechenden Close-Funktionen wieder geschlossen werden.

x68 versus x64

Die Applikation bzw. der Wrapper kann im wesentlichen ohne Veränderungen sowohl für 64-, als auch für 32-Bit Systeme übersetzt werden.

In Abhängigkeit vom Zielsystem muss hierfür die korrekte DLL des CIFX-Treibers geladen werden. Im CIFX-Treiber werden beide DLL-Versionen bereitgestellt.

Performance & PLC-Funktionen

Grundästzlich sind die PLC-Funktionen hochperformante Applikationen mit hohen Timing-Anforderungen vorgesehen. Die Verwendung von .NET an sich ist für derartige Anforderungen weniger geeignet. Bereits Windows ist standardmäßig nicht echtzeitfähig und bietet keine Möglichkeit das Zeitverhalten eines Prozesses ausreichend zu beeinflussen. Mit der .NET-Runtime kommt eine weitere Software-Schicht hinzu, die das Timing-Verhalten noch weniger voraussehbar macht.

Für Applikationen in diesem Kontext ist die Verwendung von .NET im Allgemeinen nicht zu empfehlen. Dementsprechend werden die PLC-Funktionen der CifX-API im C#-Framwork nicht unterstützt.

Hilscher - C#-Paket

Hilscher stellt ein VisualStudio-Projekt bereit, dass das P/Invoke-Frame implementiert.

Link zum Demo-Projekt, the handles must be opened using the open functions of the CIFX API and continue to exist during the runtime of the application (garbage collection).

Before ending the application, the handles should be closed again, using the corresponding close functions.

x86 versus x64

The application or the wrapper can be compiled for both (64bit and 32bit) systems.

Depending on the target system, it's only needed to load the correct DLL of the CIFX driver. Both DLL versions are provided in the CIFX driver package.

Performance & PLC functions

In principle, the PLC functions are intended for high-performance applications with high timing requirements. The use of .NET itself is less suitable for such requirements.
Windows is not real-time capable by default and does not offer the possibility of influencing the time behavior of a process sufficiently.

With the .NET runtime, there is another software layer that makes the timing behavior even less predictable.

The use of .NET is not recommended for applications in this context. Accordingly, the PLC functions of the CIFX API are not supported in the C # framework.

Hilscher - C# Packet

Hilscher provides a VisualStudio project that implements the P/Invoke frame.

Link to Demo Project:

C#.NET Demo

Innerhalb der cifXUser-Klasse werden alle CIFX-API-Funktionen im Projekt nutzbar gemacht. Außerdem stehen einige Standard-Strukturen der CIFX-API sowie Konstanten bereit.

Idealerweise kann diese Demo als Ausgangs-Projekt für die Applikations-Entwicklung genutzt werden.


Die Demo zeigt anhand eines Beispiel-Projekts auch die Einbindung der Wrapper-DLL in eine ApplikationWithin the cifXUser class, all CIFX API functions are made usable in the project. In addition, some standard structures of the CIFX API and constants are available.

Ideally, this demo can be used as a starting project for application development.

Using an example project, the demo also shows the integration of the wrapper DLL into an application.

Info
titleHinweisNote

Mit With .NET bzw. VisualStudio ist das Verwenden sowohl von C#.NET-, als auch von VB.NET-Projekten innerhalb einer VisualStudio-Solution möglich.Hierfür kann einfach ein Projekt des entsprechenden Typs hinzugefügt werden: File → Add → or VisualStudio it is possible to use both C # .NET and VB.NET projects within a VisualStudio solution.

To do this, a project of the corresponding type can simply be added: File → Add → New Project.

C# .NET - Access Violation Exception

Ein häufig auftretendes Problem bei der Verwendung von C#A common issue while using C # .NET in Verbindung mit den CIFX-Bibliotheken, ist die „Access Violation Exception“. Sie entsteht bei Verwendung eines falschen Pointer-Typen bei einer 64-Bit Applikationconjunction with the CIFX libraries is the "Access Violation Exception". It occurs when using the wrong pointer type in a 64-bit application:

"In .NET there is an integral data type, not widely known, that is specifically designated to hold 'pointer' information:  IntPtr whose IntPtr whose size is dependent on the platform (e.g.eg, 32-bit or 64-bit) it is running on. "

Code Block
titleBeispielExample
public void SizeOfIntPtr() {Console.WriteLine( "SizeOf IntPtr is: {0}", IntPtr.Size );}


Ausgeführt auf einer Executed on a 32-bit Platform bekommen sie die folgende Ausgabeplatform, you get the following output:

SizeOf IntPtr is: 4

 

Auf einer On a 64-bit Platform sieht die Ausgabe wie folgt ausplatform the output looks like this:

SizeOf IntPtr is: 8"

Lösung

Im alten Code wurden einige Funktionsparameter als 32bit Parameter gesetzt.

...

Solution

In the old code, some function parameters were set as 32-bit parameters.

In the new version, the pointers described above are used instead, in order to work for both 32-bit and 64-bit applications.

Code Block
titleAltOld
[DllImport("cifx32dll.dll", EntryPoint = "xChannelOpen")] 

private static extern UInt32 _xChannelOpen(

UInt32 hDriver,

[MarshalAs(UnmanagedType.LPStr)] string szBoard,

UInt32 ulChannel,

[MarshalAs(UnmanagedType.U4)] ref UInt32 phChannel);


Code Block
titleNeuNew
[DllImport("cifx32dll.dll",EntryPoint = "xChannelOpen")]

private static extern Int32 _xChannelOpen (

IntPtr hDriver,

[MarshalAs(UnmanagedType.LPStr)] string szBoard,

UInt32 ulChannel,

ref IntPtr phChannel);

...