c# compilieren in Abhängigkeit von 64 oder 32 bit?

Gast #2654693
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
#2654779
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
Gast #2654814
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
Gast #2655307
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
Gast #2655323
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.
#2655816
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren