Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Einbinden von C Code in C# möglich ?

408 views
Skip to first unread message

Peter Richt

unread,
Nov 19, 2002, 1:43:24 AM11/19/02
to
Hallo,

ich möchte verschiedene Treiber welche für C bzw VB geschrieben sind in C#
einbinden, ist das generell möglich ? Diese Treiber verwenden für den Zugriff
eine DLL Datei, zugegriffen wird dann unter C direkt auf die DLL.


Gruss

Peter

Thomas Scheidegger [MVP] NETMaster

unread,
Nov 19, 2002, 3:45:55 AM11/19/02
to
> verschiedene Treiber
Der Begriff 'Treiber' ist etwas vieldeutig ...
Vermutlich sind dies nur für Dich sog. 'Treiber',
ansonst jedoch normale Win32/C/C++/VB Apps oder Komponenten.
(Treiber sind in Windows spezielle 'Device Driver' im Kernel)

> einbinden, ist das generell möglich ?

Direkt geht dies nicht.

Falls Du wirklich C code in .NET einbinden willst,
musst Du 'Managed C++' nehmen:

http://msdn.microsoft.com/vstudio/techinfo/articles/upgrade/managedext.asp
http://www.gotdotnet.com/team/cplusplus/
im VS.NET Pfad:
...\VC7\managedextensionsspec.doc
...\VC7\migration_guide.doc

Oder Du schreibst den Code in C# um,
und greifst auch direkt auf die DLLs zu,
per PInvoke (DllImport):

http://msdn.microsoft.com/library/en-us/dncscol/html/csharp09192002.asp

--
Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

"Peter Richt" <peter...@yahoo.de> wrote in message news:a978b3aa.0211...@posting.google.com...

Thomas Bolt

unread,
Nov 19, 2002, 3:53:52 AM11/19/02
to
Hallo

Wenn ich das richtig verstanden habe, hast du bereits fertige DLL's aus
denen du einige Methoden aufrufen musst.
Dabei musst du keinen Code umschreiben. Du verwendest sie per PInvoke
(DllImport) wie schon Thomas Scheidegger unter anderem erklärt hat.

Gruss Thomas Bolt (eidg. dipl. Informatiker)
Leading Software Engineer (isonet ag Zürich)


cody

unread,
Nov 19, 2002, 5:53:43 AM11/19/02
to
und wie ruft man dann die funktionen aus der dll auf? in c# geht ja alles
über klassen, bei c dagegen gibt es nur funktionen. wenn ich z.b. in der dll
eine funktion namens "int test(char*, int);" habe, wie ruft man die dann in
c# auf?


Thomas Bolt

unread,
Nov 19, 2002, 7:02:25 AM11/19/02
to
Als erstes erstellst du zum Beispiel eine abstrakte Klasse, in der sich alle
deine Methoden (Funktionen aus den DLL's) als static deklariert befinden.
Vorsicht bei den Datentypen, da z.B. ein int in C 16Bit lang ist, und in C#
32Bit.

public abstract class MeineTreiberFunktionen {
[DllImport("meine.dll", CharSet=CharSet.Auto)]
public static short test(IntPtr var1, short var2);
}


Jetzt kannst du die Methoden direkt aufrufen, ohne eine Instanz der Klasse
erstellen zu müssen (da abstrakt).

Thomas Scheidegger [MVP] NETMaster

unread,
Nov 19, 2002, 9:37:47 AM11/19/02
to
> Vorsicht bei den Datentypen, da z.B. ein int in C 16Bit lang ist, und in C# 32Bit.

Dies hast Du eben gerade vertauscht.
Seit Windows 32-Bit geworden ist (vor fast 10 Jahren!),
ist der Win32/C/C++ Datentyp 'int' auch 32-Bit.

Daher bleibt int => int in C# :
....
public static int test( IntPtr var1, int var2 );

Man beachte, der C# 'int' Typ ist ein Alias für
den .NET Typ Int32, d.h. immer 32-Bit, auch
auf neuen 64-Bit Prozessoren in Zukunft.

Dafür gibt es auch Int64 in .NET, 'long' Alias in C#.
=> Wichtig: Win32/C/C++ 'long' ist auch 'int' in C# !!!

Und 'IntPtr var1' könnte man (da in C: char*) wahrscheinlich
als 'string var1' definieren, hängt aber SEHR von der DLL ab.

Thomas Bolt

unread,
Nov 19, 2002, 10:08:10 AM11/19/02
to
> Dies hast Du eben gerade vertauscht.
> Seit Windows 32-Bit geworden ist (vor fast 10 Jahren!),
> ist der Win32/C/C++ Datentyp 'int' auch 32-Bit.
>
> Daher bleibt int => int in C# :
> ....
> public static int test( IntPtr var1, int var2 );

Upppsss!! Habe das wohl irgendwie verwechselt!! Komme halt nicht von der
C-Seite.
Danke für die Korrektur...


> Und 'IntPtr var1' könnte man (da in C: char*) wahrscheinlich
> als 'string var1' definieren, hängt aber SEHR von der DLL ab.

Genau! Darum habe ich im Beispiel einen IntPtr verwendet...


Gruss Thomas Bolt


Peter Ebel

unread,
Nov 19, 2002, 1:50:18 PM11/19/02
to
Hallo,

> public abstract class MeineTreiberFunktionen {
> [DllImport("meine.dll", CharSet=CharSet.Auto)]
> public static short test(IntPtr var1, short var2);
>}

in welchem Verzeichnis muss denn die "meine.dll" sein,
bzw. kann ich das Verzeichnis irgendwo angeben ?

Gruss

Peter


Thomas Scheidegger [MVP] NETMaster

unread,
Nov 19, 2002, 2:09:58 PM11/19/02
to
> in welchem Verzeichnis muss denn die "meine.dll" sein,
> bzw. kann ich das Verzeichnis irgendwo angeben ?

DLLs für DllImport müssen im selben Verzeichnis sein wie
die C#/.NET EXE.

Falls dies wirklich nicht möglich ist, kann man
- die %PATH% Umgebungs-Variable erweitern,
- oder per PInvoke auf LoadLibraryEx die DLL vorab laden:


// =====================================

[DllImport( "Your.dll", SetLastError=false, ...... )]
private static extern int YourCall( .... );

[DllImport( "kernel32.dll", CharSet=CharSet.Auto, SetLastError=true )]
private static extern IntPtr LoadLibraryEx( string fileName, IntPtr dummy, int flags );

...........

string fullPath = @"D:\YourPath\Your.dll"; // do whatever to find the full path of your DLL

IntPtr h = LoadLibraryEx( fullPath, IntPtr.Zero, 8 ); // 8:LOAD_WITH_ALTERED_SEARCH_PATH
if( h == IntPtr.Zero )
return; // todo: error handling!

int r = YourCall( .... ); // now call you own DLL

// =====================================

Peter Ebel

unread,
Nov 19, 2002, 3:30:46 PM11/19/02
to
Danke

Gruss

Peter

"Thomas Scheidegger [MVP] NETMaster" <spam.ne...@swissonline.ch> schrieb
im Newsbeitrag news:O9DeB9$jCHA.1696@tkmsftngp12...

0 new messages