Laden...

DLL Architektur feststellen (32bit/64bit/AnyCPU)

Erstellt von Ramokthan vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.931 Views
R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 4 Jahren
DLL Architektur feststellen (32bit/64bit/AnyCPU)

Ich muss zugeben ich bin verwirrt. Ich habe mich jetzt schon mehrere Tage mit der Materie beschäftigt und streite mich auch schon mit einem Kollegen darüber.

Grundsätzlich geht es darum dass wir eine 32Bit applikation haben und ich eine DLL von ebenjenen Kollegen brauche die entweder 32bit oder ANYCPU ist.

Ich habe Google bereits gefragt wie man das prüfen kann, allerdings scheinen da zumindest 2 Analysevorgehensweisen parallel zu existieren die sich gegenseitig meiner Meinung nach widersprechen.

Eine davon habe ich persönlich verifiziert und glaube das das auch die richtige ist, ich glaube aber auch nicht das alles was über die andere Analysevogehensweise grundsätzlich falsch ist.

Kurzum:
Ich benutze corflags in der Dev Console von VS2015 welches mir Meiner meinung nach an meinen Testdlls zuverlässig sagen konnte ob eine dll 32bit, 64 bit oder ANYCPU ist. jedenfalls stimmten die ausgaben mit denDatenblättern im Internet.

Jetzt sagen aber andere Seiten (und das ist auch wo mein Kollege drauf besteht) dass sobald der tag ILONLY in der dll gesetzt ist, es eine ANYCPU dll ist. Ein paar Internetseiten bestätigen dies auch.

Das problem bei dem ist nur, dass meine testweise erstellte 32bit dll, bzw ALLE dlls, unabhängig wie ich sie kompiliere dieses Tag haben. Logischerweise läuft aber eine 32bit dll mit dem tag trotzdem nicht auf einer 64bit applikation und vice versa.

Das heißt ich bin ein wenig in erklärungsnot.

Einerseits sagen die übrigen Flags zuverlässig für was die DLL kompiliert wurde, andererseits sagen einschlägige seiten dass die DLL ANYCPU ist wenn das ILONLY flag gesezt ist, was allerdings bei jeder DLL bei mir der fall ist, auch soche die nicht mit 32/64 bit kompatibel sind.

Also was ist das ILONLY (msil) nun wirklich?
Hat es überhaupt noch eine technische Bedeutung?
War das vielleicht früher die Kennzeichnung von ANYCPU dlls aber heute nicht mehr?

Wäre schön wenn man mir da ein wenig mehr Klarheit und Sicherheit in meinen Beobachtungen geben könnte. Es ist schwierig einen Kollegen zu überzeugen wenn man sich seiner eigenen Fakten nicht sicher ist.

Danke

S
248 Beiträge seit 2008
vor 4 Jahren

Hallo Ramokthan,

leider konnte ich auf die schnelle auch keine Dokumentation zu der genauen Bedeutung von ILONLY finden. Nachdem ich einige DLLs von uns mit corflags.exe angeschaut habe, gehe ich davon aus, dass das Flag bedeutet, dass kein unmanaged code vorhanden ist und nichts mit 32/64/AnyCPU an sich zu tun hat.
Bei einer unserer Mix-Mode DLLs ist ILONLY 0 und ILSpy gibt folgende Info aus:
"This assembly contains unmanaged code."

Ansonsten würde ich auf die Tabelle in folgendem Post verweisen (diese scheint mir korrekt zu sein):
How to interpret the CorFlags flags?

Grüße
spooky

edit:Typo

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 4 Jahren

Ninja
@Th69
Das weiß ich bereits, das mache ich ja bereits über corflags, mir ging es eher um die Verwirrung die verursacht wird durch aussagen über ILONLY, das diesen Angaben nach ausschließlich ausschlaggebend über 32/64 bit wäre, was nicht der Wahrheit entspricht.

@ Spook Das deckt sich mit meinen Beobachtungen zu 100%, dass ILONLY nichts mit der kompilierten Architektur sondern damit zu tun hat ob es ausschließlich managed code enthält oder nicht.

Also ist diese beispiel Quelle: External Link

Der Punkt

Anything marked with ILOnly can run on both 64bit and 32bit.

scheint daher falsch bzw missverständlich formuliert zu sein.

Ähnliche aussagen finden sich auch an anderen Quellen im Internet und führen dann zur falschen schlussfolgerung dass alles was ILONLY, also ausschließlich managed code ist auf allen Systemen ausführbar ist.

4.931 Beiträge seit 2008
vor 4 Jahren

Also um es deutlicher zu sagen (auch wenn es m.E. aus der Beschreibung in den Links schon hervorgeht):
Nur wenn das Flag ILOnly alleine gesetzt ist, dann entspricht dies "ANYCPU", ansonsten kommt es eben auf die anderen Flags an.

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 4 Jahren

Ok, jetzt hast du mich neugierig gemacht.

Kannst du mir einen Fall zeigen wo es ausser ILONLY keine anderen flags gibt?

In meinen Fällen trifft nämlich auch auf 64bit dll zu.

CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0

dort ist NUR das ILONLY flag gesetzt, ABER es ist eine 64 bit dll und damit NICHT ANYCPU.

4.931 Beiträge seit 2008
vor 4 Jahren

PE32+ ist auch ein Flag (wie auch in dem Link, den Spook gepostet hat, steht).

Hast du überhaupt unsere Links gelesen?

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 4 Jahren

Das PE32+ auch ein Flag ist ist mir vollkommen klar.
Unglücklich ausgedrückt, zugegeben.

Ich meinte das in meinem Beispiel nur das ILONLY Flag gesetzt ist aber trotzdem ein PE Flag existiert.
Und ich kein beispiel kenne wo das PE Flag fehlen würde.

Aus Neugierde habe ich gefragt ob du mir daher ein Beispiel geben kann wo NUR ILONLY gesetzt ist.

Denn nach meinen bisherigen Beobachtungen gibt es IMMER ein PE32 oder PE32+ Flag, das heißt ILONLY ist NIEMALS alleine.

Schlussendlich hätte ich nur gern ein Beispiel wo deine Äusserung

Nur wenn das Flag ILOnly alleine gesetzt ist, dann entspricht dies "ANYCPU", ansonsten kommt es eben auf die anderen Flags an.

zutrifft.

Ps:
Die Links beschreiben nur wovon wir sowieso die ganze Zeit reden, sehe da keine tiefere Relevanz warum das jetzt besonders wichtig wäre dass ich die gelesen habe.

Viele Grüße

4.931 Beiträge seit 2008
vor 4 Jahren

Es gibt nur ein Flag namens "PE32+" (bzw. pe32Plus - wie schon oben geschrieben s. CorPEKind Enumeration) und wenn dieses nicht gesetzt ist, dann wird das von CorFlags einfach als "PE32" angezeigt (Edit: Also es gibt kein eigenständiges Flag "PE32"!).

Also jetzt noch mal aus dem Link von Spook:


CPU     | PE       | 32BIT(REQ)
--------|----------|------
x86     | PE32 (0) |  1   
Any CPU | PE32 (0) |  0   
x64     | PE32+(1) |  0   

(ergänzt um (0) bzw. (1))
Und bei "Any CPU" ist keines der beiden Flags "PE32+" sowie 32BITREQ gesetzt (und genau das meinte ich oben).

4.931 Beiträge seit 2008
vor 4 Jahren

Ramokthan: Hast du es jetzt verstanden? Dann kannst du deinem Kollegen sagen, daß das Flag ILONLY nichts über die Architektur (Any CPU, x86, x64) aussagt, sondern dafür eben die anderen 2 Flags PE32+ und 32BITREQ zuständig sind.