Forum: PC-Programmierung c# compilieren in Abhängigkeit von 64 oder 32 bit?


von Peter (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> das Problem ist, ich habe beide DLL's im gleichen Ordner liegen...

dann ändere das doch

von Peter (Gast)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Hallo Frank,

das [DllImport("MyDll32")] steht innerhalb der Klassendefinition da ist 
nichts mit irgendwelchem Code.

von __tom (Gast)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

Ja dann ist das natürlich hardcodiert drin.

Kannst Du die DLL nicht dynamisch mit LoadLibrary() und GetProcAddress() 
laden?

fchk

von Peter (Gast)


Lesenswert?

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!

von Peter (Gast)


Lesenswert?

Wie gesagt, über LoadLibrary() habe ich bisher noch garnicht nachgedacht 
- werd ich jetzt mal tun :)!

von Arc N. (arc)


Lesenswert?

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)

von Peter (Gast)


Lesenswert?

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

von bluppdidupp (Gast)


Lesenswert?

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)

von Peter (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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...

von Frank K. (fchk)


Lesenswert?

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
Noch kein Account? Hier anmelden.