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
> 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...
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)
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).
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.
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
> 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
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
// =====================================
Gruss
Peter
"Thomas Scheidegger [MVP] NETMaster" <spam.ne...@swissonline.ch> schrieb
im Newsbeitrag news:O9DeB9$jCHA.1696@tkmsftngp12...