Hallo.
Angenommen es soll eine 64Bit c# dll erzeugt werden. Diese Dll soll also
auf 64Bit OS auch wirklich als 64Bit laufen und nicht unter dem WOW64
Zweig. Nun habe ich einen 32Bit Rechner, mit dem ich mittles VS2010
diese dll mit der Zielplattform 64 bit erstellen möchte.
Gibt es einen Unterschied ob ich mit VS2010 auf einen 32Bit Rechner
64Bit Anwendungen erstelle, oder VS2010 direkt auf 64bit laufen
lasse.(Es gibt ja eh nur eine 32bit VS10 Version)?
Gibt es Einschränkungen in dem Falle?
[32bit Rechner] [64bit Rechner]
| | |
VS2010 64bit 32bit
| |
64bit dll--> App
Benno schrieb:> Gibt es einen Unterschied ob ich mit VS2010 auf einen 32Bit Rechner> 64Bit Anwendungen erstelle, oder VS2010 direkt auf 64bit laufen> lasse.(Es gibt ja eh nur eine 32bit VS10 Version)?> Gibt es Einschränkungen in dem Falle?
ich denke nein. Es wird ja nur in der Datei vermerkt für welche
Plattform sie ist. Am Inhalt sollte sich dabei nichts ändern.
Warum willst du die Datei fest auf 64bit setzen?
Peter II schrieb:> Benno schrieb:>> Gibt es einen Unterschied ob ich mit VS2010 auf einen 32Bit Rechner>> 64Bit Anwendungen erstelle, oder VS2010 direkt auf 64bit laufen>> lasse.(Es gibt ja eh nur eine 32bit VS10 Version)?>> Gibt es Einschränkungen in dem Falle?>> ich denke nein. Es wird ja nur in der Datei vermerkt für welche> Plattform sie ist. Am Inhalt sollte sich dabei nichts ändern.>> Warum willst du die Datei fest auf 64bit setzen?
Sie soll dem Anwender als reale 64bit dll yur Verfuegung stehen.
Benno schrieb:> Sie soll dem Anwender als reale 64bit dll yur Verfuegung stehen.
die frage ist warum?
lass es doch Windows entscheiden ob es als 32bit oder 64bit ausführt. So
musst du ja 2 Versionen ausliefern, falls jemand nur ein 32bit System
hat.
Habe ich gerade gelesen:
Visual Studio installiert die 32-Bit-Version der CLR auf einem
x86-Computer und sowohl die 32-Bit-Version als auch die entsprechende
64-Bit-Version der CLR auf einem 64-Bit-Windows-Computer.
Es gibt anscheinend 2 CLRs. Die 32bittige auf dem 32bit Host und die
64bittige, wobei VS10 32bittig im WOW64 liegt. Resultiert daraus auch
unterschiedlicher Code?
Benno schrieb:> Es gibt anscheinend 2 CLRs. Die 32bittige auf dem 32bit Host und die> 64bittige, wobei VS10 32bittig im WOW64 liegt. Resultiert daraus auch> unterschiedlicher Code?
wie schon oben geschrieben, ich glaube nicht.
Klar muss eine 32bit Runtime und eine 64bit Runtime vorhanden sein,
sonnst könnte man ja nicht 32bit oder 64bit Programm starten.
Was meinst du mit Referenzen?
Ist das richtig, das mit AnyCPU eine dll 64bittig ist, wenn die
Anwendung, die sie einbindet 64 bit ist, respektive 32bit, bei 32bit
Anwendung?
Benno schrieb:> Ist das richtig, das mit AnyCPU eine dll 64bittig ist, wenn die> Anwendung, die sie einbindet 64 bit ist, respektive 32bit, bei 32bit> Anwendung?
ja
Benno schrieb:> Was meinst du mit Referenzen?
fall von der dll wiederrum anderen dll (die in C/C++) geschrieben sind
verwendet, dann sind die ja 32 oder 64bit). Damit ist dann man auf die
Plattform festgelegt.
Das es so funktioniert liegt, wenn ich richtig liege, an der Art und
Weise, wie in .net Binarcode erzeugt wird. Also nur eine Assembly-Datei,
die nur die Informationen ueber die Architektur auf die es laufen soll,
enthält. Erst die CLR und der Just-In Compiler macht daraus den
32/64bittigen Binarcode.
Ich komme aus der c++-Ecke, da war Binarcode noch wenigstens
Binarcode(Maschinencode) ;-)
Noch eine Frage:
Sollte ich mit AnyCPU immer Plattformabhängige Typen wählen(z.b.IntPtr)
oder lieber normal int? Erzeugt mir denn die ClR mit der Option AnyCPU
immer die richtige int Größe? 4Byte int würde ja die 64bittige Anwendung
nicht vertragen.
Benno schrieb:> Sollte ich mit AnyCPU immer Plattformabhängige Typen wählen(z.b.IntPtr)> oder lieber normal int?
wozu brauchst du in einer C# Anwendung IntPtr? Dieser wird doch nur im
Zusammenhang mit anderen (C oder C++) dlls verwendet.
Und wenn jeweils die passenden dll geladen wird, dann ist IntPtr auch
der richtige Datentype.
Du solltest eventuell etwas mehr zu dem Problem sagen, irgendwie kommen
immer mehr neue Infos.
Benno schrieb:> Erzeugt mir denn die ClR mit der Option AnyCPU> immer die richtige int Größe? 4Byte int würde ja die 64bittige Anwendung> nicht vertragen.
Du solltest Dir vielleicht mal die .Net-Typen genauer anschauen.
System.Int32 (unter C# äquivalent zu int) hat immer 32 Bit, egal ob
64-Bit- oder 32-Bit-Plattform. Solchen Quatsch wie unter anderen
Sprachen, dass int auf den einzelnen Plattformen unterschiedliche Größen
haben könnte, gibt es unter .Net nicht.
Grüße
Markus
Falls du mit AnyCPU kompilierst und irgendwo, irgendwie, direkt oder
indirekt eine 32-Bit-DLL angefunkt wird, knallt es auf einem
64-Bit-System. Meiner Erfahrung nach ist dies in ~80% aller Fälle, in
denen ein .NET-Programm auf 64-Bit direkt beim Starten abstürzt, die
Fehlerursache. Kurz: Wenn du keinen Grund hast, lass es bleiben. Wenn du
glaubst, einen Grund zu haben, musst du das Ding sowieso auf einem
64-Bit-System testen, um herauszufinden, ob deine Annahme stimmt.
BTW: Man kann mit corflags 32-Bit erzwingen, ohne das Programm neu zu
kompilieren.
https://msdn.microsoft.com/en-us/library/ms164699%28v=vs.110%29.aspx
Das hat mich schon ein paar Mal bei oben genanntem Problem "gerettet".