Hallo, ich versuche eine (bzw. zwei) DLL(s) in C# Visual Studio Express einzubinden. Und jenachdem ob ich ein 32 oder 64 Bit Betriebssystem habe, muß eben [DllImport("MyDll32")] oder [DllImport("MyDll64")] ausgeführt werden. Bzw. ist es ja so, das in C# immer für beide Plattformen Code erstellt wird. Also, wie mach ich das? Vielen Dank schonmal im Voraus! Gruß Peter
Peter schrieb: > Also, wie mach ich das? gibt beiden dlls (64 und 32bit) den gleichen namen, dann sollte es immer gehen. Ein c# programm muss nicht für 64 oder 32 bit zwei mal estellt werden, man kann auch einstellen das es Platformunabhängig ist, dann würde es auch auf einem ARM laufen.
Servus Peter II, das Problem ist, ich habe beide DLL's im gleichen Ordner liegen... (jeweils Debug/Release), da geht das nicht mit gleichem Namen. Gruß Peter
Peter schrieb: > das Problem ist, ich habe beide DLL's im gleichen Ordner liegen... dann ändere das doch
Einfach in den Projektordner zwei neue Ordner (WIN32 und WIN64) und dann sucht sich der Linker den richtigen Pfad, oder wie? So nebenbei, die DLL's sind unmanaged (VC++). Spielt aber wohl keine Rolle,oder doch? Gruß Peter
Peter schrieb: > Hallo, > > ich versuche eine (bzw. zwei) DLL(s) in C# Visual Studio Express > einzubinden. Und jenachdem ob ich ein 32 oder 64 Bit Betriebssystem > habe, muß eben > > [DllImport("MyDll32")] > > oder > > [DllImport("MyDll64")] > > ausgeführt werden. Bzw. ist es ja so, das in C# immer für beide > Plattformen Code erstellt wird. Also, wie mach ich das? Siehe http://msdn.microsoft.com/en-us/library/ms724381%28v=vs.85%29.aspx und http://msdn.microsoft.com/en-us/library/ms724958%28v=vs.85%29.aspx fchk
Hallo Frank, das [DllImport("MyDll32")] steht innerhalb der Klassendefinition da ist nichts mit irgendwelchem Code.
Peter schrieb: > ausgeführt werden. Bzw. ist es ja so, das in C# immer für beide > Plattformen Code erstellt wird. Also, wie mach ich das? wenn du ein AnyCPU-Assembly erstellen möchtest, dann kannst du pinvoke nicht mehr verwenden und musst mit LoadLibrary() die entsprechende dll mit der hand laden. das ganze kann man dann mit Marshal.GetDelegateForFunctionPointer() .net tauglich machen. ob die anwendung unter x86 oder x64 läuft kannst du zur laufzeit mit IntPtr.Size testen, auf x86 systemen ist das 4 und auf x64 8. du kannst auch für x86 und x64 getrennte assemblies erstellen und den dll import durch "conditional compilation" abgrenzen. z.b. in der x64 config das symbol CPU_X64 definieren und die pinvoke-definitionen sehen dann so aus: #if CPU_X64 [DllImport("MyDll64")] #else [DllImport("MyDll32")] #endif
Ja dann ist das natürlich hardcodiert drin. Kannst Du die DLL nicht dynamisch mit LoadLibrary() und GetProcAddress() laden? fchk
Hallo __tom, dann versuch ichs mal mit LoadLibrary(), da ich mit der Express Version arbeite und da kann man soweit ich weiß sowieso nur AnyCPU erstellen. Danke Dir!
Wie gesagt, über LoadLibrary() habe ich bisher noch garnicht nachgedacht - werd ich jetzt mal tun :)!
http://stackoverflow.com/questions/145803/targeting-both-32bit-and-64bit-with-visual-studio-in-same-solution-project (in wie weit das mit der Express-Version geht, kann ich hier nicht testen. Ansonsten könnte z.Z. auch die VS11-Beta verwendet werden)
Also, ich habe das mal ausprobier, und es funktioniert (wobei ich vorerst nur unter WIN 7 64 Bit getestet habe. Jedenfalls lädt er abhängig vom IntPtr die richtige DLL und der Aufruf der Funktionen klappt im Anschluß auch. Und jetzt brauche ich alles nochmal für VB. Da hab ich das Problem auch und da ist es leider nicht so einfach zu machen. Nochmals vielen Dank! Gruß Peter
Wenn du einen Installer hast könntest du auch einfach vom Installer die passende dll in den Programmordner kopieren lassen (und dann beide gleich nennen)
Hallo bluppdidupp, Es geht darum eine kleine Demo App im Quellcode zu erstellen, die ein paar Funktionen der DLL demonstriert, damit der Anwender/Nutzer (der DLL) weiß, wie er das zu machen hat. Es wird dann das ganze Visual Studio Projekt (VB oder C#) weitergegeben und es soll je nach Zielplattform gleich die richtige DLL beim Linken mit eingebunden werden. Deswegen fällt die Möglichkeit mit dem Installer leider weg, da ja nichts installiert wird.
Allerdings frag ich mich gerade, ob ich da nicht zu viel Aufwand betreibe. Ganz am Anfang hat PeterII einen Vorschlag in die gleiche Richtung gemacht. Die DLLs (32 und 64 Bit) gleich benennen und eben ja nach Plattform die entsprechende hinzukopieren...
Peter schrieb: > Also, ich habe das mal ausprobier, und es funktioniert (wobei ich > vorerst nur unter WIN 7 64 Bit getestet habe. Jedenfalls lädt er > abhängig vom IntPtr die richtige DLL und der Aufruf der Funktionen > klappt im Anschluß auch. Du solltest das mit GetSystemInfo() machen. Nachher kommt jemand und lädt die Assembly auf 'nem ARM... Der Weg über die Größe von IntPtr ist Pfusch. fchk
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.