Forum: PC-Programmierung C# dll 64 bit


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Benno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Benno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Benno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Borislav B. (boris_b)


Bewertung
0 lesenswert
nicht lesenswert
Bau die DLL doch besser als AnyCPU, falls es deine Referenzen zulassen.
Macht das Leben leichter ;-)

von Benno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Benno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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) ;-)

von Benno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Markus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Haspar Kauser (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.