Migrieren von 32-Bit-verwaltetem Code auf 64-Bit
Hinweis: Wenn Sie zur Laufzeit überprüfen möchten, ob Sie in einer 64-Bit-Umgebung ausgeführt werden, können Sie die IntPtr.Size als eine Art und Weise verwenden können, um diese Bestimmung vorzunehmen.
Überlegungen zur Migration
Wenn verwaltete Anwendungen migrieren, die p verwenden / aufrufen, die folgenden Punkte beachten:
- Verfügbarkeit einer 64-Bit-Version der DLL
- Die Verwendung von Datentypen
Verfügbarkeit
Eines der ersten Dinge, die bestimmt werden muss, ist, ob der nicht verwalteten Code, der Ihre Anwendung eine Abhängigkeit hat auf 64-Bit verfügbar ist.
Wenn dieser Code von einer dritten Partei ist, müssen Sie prüfen, ob dieser Dritte bereits den Code für 64-Bit zur Verfügung hat und ob der Dritte wäre bereit, sie zur Verfügung zu stellen.
Das höhere Risiko Problem entstehen, wenn der Dritte nicht mehr bietet Unterstützung für diesen Code oder wenn der Dritte ist nicht bereit, die Arbeit zu tun. Diese Fälle erfordern zusätzliche Untersuchungen in verfügbaren Bibliotheken, die eine ähnliche Funktionalität zu tun, ob der Dritte lässt der Kunde den Hafen selbst tun, usw.
Datentypen
Diese Änderung wird die 32-Bit- und 64-Bit-Umgebungen in beide arbeiten. Denken Sie daran, IntPtr ist plattformspezifisch.
Mit p / aufrufen in Ihrer verwalteten Anwendung bedeutet nicht, dass 64-Bit-Plattform, um die Migration wird nicht möglich sein. Es bedeutet auch nicht, dass es Probleme geben. Was es bedeutet, ist, dass Sie die Abhängigkeiten von nicht verwalteten Code überprüfen müssen, dass Ihre verwaltete Anwendung hat, und festzustellen, ob es irgendwelche Probleme sein.
Interoperabilität Migration und COM
COM-Interoperabilität ist ein angenommener Fähigkeit der .NET-Plattform. Wie die vorherige Diskussion über Plattformaufruf, die Nutzung von COM-Interoperabilität bedeutet, dass verwalteten Code ist, Anrufe auf nicht verwalteten Code zu machen. Doch anders als Plattform invoke, COM-Interoperabilität bedeutet auch die Fähigkeit haben, für nicht verwalteten Code verwalteten Code aufrufen, als ob es sich um eine COM-Komponente waren.
Wiederum unter Verwendung von nicht verwalteten COM-Code bedeutet nicht, dass eine Migration auf 64-Bit wird Probleme haben; es sollte vielmehr einen Indikator in Betracht gezogen werden, dass weitere Untersuchungen erforderlich.
Überlegungen zur Migration
Es folgt eine Diskussion der verschiedenen Überlegungen, die Verwendung von COM-Interoperabilität gegeben werden muß, um zu machen, wo verwalteten Code macht COM-Aufrufe in einer 64-Bit-Umgebung. Speziell,
- Verfügbarkeit einer 64-Bit-Version der DLL
- Die Verwendung von Datentypen
- Typbibliotheken
Verfügbarkeit
Die Diskussion in der p / invoke Abschnitt in Bezug auf die Verfügbarkeit eines 64-Bit-Version des abhängigen Code ist auch für diesen Bereich relevant.
Datentypen
Die Diskussion in dem p / invoke Abschnitt in Bezug auf Datentypen von einer 64-Bit-Version des abhängigen Code ist auch für diesen Bereich relevant.
Typbibliotheken
COM-Interoperabilität in Ihrer verwalteten Anwendung verwenden, bedeutet nicht, dass 64-Bit-Plattform, um die Migration wird nicht möglich sein. Es bedeutet auch nicht, dass es Probleme geben. Was es bedeutet, ist, dass Sie die Abhängigkeiten Ihrer verwalteten Anwendung hat überprüfen müssen und festzustellen, ob es irgendwelche Probleme sein.
Migration und unsicherer Code
Der Kern C # Sprache unterscheidet sich insbesondere von C und C ++ in ihr Weglassen von Zeigern als Datentyp. Stattdessen bietet C # Referenzen und die Fähigkeit, Objekte zu erstellen, die von einem Garbage Collector verwaltet werden. In der Sprache C # Kern ist es einfach nicht möglich, eine nicht initialisierte Variable zu haben, eine „baumelnde“ Zeiger oder einen Ausdruck, der ein Array-Indizes außerhalb seiner Grenzen. Ganze Kategorien von Fehlern, die routinemäßig C und C ++ Programme plagen sind so ausgeschlossen.
Überlegungen zur Migration
Um die möglichen Probleme mit unsicheren Code wollen wir erforschen das folgende Beispiel zu diskutieren. Unsere verwalteten Code macht Anrufe an eine nicht verwaltete DLL. Insbesondere gibt es ein Verfahren GetDataBuffer aufgerufen, die 100 Elemente zurückgibt (für dieses Beispiel sind wir eine feste Anzahl von Einzelteile zurückbringen). Jedes dieser Elemente besteht aus einer ganzen Zahl und einen Zeiger. Der folgende Beispielcode ist ein Auszug aus dem verwalteten Code, um die unsichere Funktion verantwortlich für den Umgang mit diesen Daten zurückgegeben zeigt.
Die UnsafeFn Schleifen durch die Elemente 100 und summiert die ganzzahlige Daten. Wie wir durch einen Puffer von Daten gehen, muss der Code über die ganze Zahl beide, und der Zeiger zu dem Schritt. In der 32-Bit-Umgebung funktioniert dieser Code in Ordnung. Wie wir jedoch zuvor besprochen haben, Zeiger sind 8 Bytes in dem 64-Bit-Umgebung und damit die Code-Segment (siehe unten) wird nicht korrekt funktionieren, da es die Verwendung eines gemeinsamen Programmiertechnik machen, z.B. einen Zeiger als äquivalent zu einer Ganzzahl zu behandeln.
Wie wir gerade gesehen haben, gibt es Fälle, in denen unsicheren Code erforderlich ist. In den meisten Fällen wird es als Folge des verwalteten Code der Abhängigkeit von einer anderen Schnittstelle erforderlich. Unabhängig von den Gründen unsicherer Code vorhanden ist, hat es als Teil des Migrationsprozesses überprüft werden.
Das Beispiel, das wir oben verwendet wird, ist relativ einfach und das Update der Programmarbeit in 64-Bit war einfach zu machen. Offensichtlich gibt es viele Beispiele von unsicheren Code, die komplexer sind. Einige werden tiefe Bewertung erfordern und vielleicht einen Schritt zurück und überdenken das Konzept des verwalteten Code verwendet.
Um es zu wiederholen, was Sie hat bereits gelesen betriebene unsicheren Code in Ihrer verwalteten Anwendung bedeutet nicht, dass 64-Bit-Plattform, um die Migration wird nicht möglich sein. Es bedeutet auch nicht, dass es Probleme geben. Was es bedeutet, ist, dass Sie alle den unsicheren Code Ihrer verwalteten Anwendung hat und festzustellen, ob es irgendwelche Probleme werden überprüfen müssen.
Überlegungen zur Migration
LayoutKind.Sequential
Lassen Sie sich die Definition überprüfen, wie in der .NET Framework SDK-Hilfe geliefert:
„Die Mitglieder des Objekts sequentiell angelegt, in der Reihenfolge, in der sie erscheinen, wenn sie auf nicht verwalteten Speicher exportiert. Die Mitglieder nach in StructLayoutAttribute.Pack angegeben an der Verpackung angelegt sind. Und können nicht angrenzenden sein.“
Hier ist ein Bereich, den wir brauchen Aufmerksamkeit der Verpackung zu zahlen, und zur gleichen Zeit, versuchen, das System wirkt in ihrem bevorzugten Modus zu lassen.
Das Folgende ist ein Beispiel einer Struktur wie in verwalteten Code definiert ist, sowie die in nicht verwalteten Code definierte entsprechende Struktur. Sie sollten sorgfältig zur Kenntnis nehmen, wie dieses Beispiel zeigt, in beiden Umgebungen die Packung Wert.
Die Analyse des Codes zeigt an, ob getrennte Binärdateien für jede der Plattformen erforderlich sind und ob Sie auch Änderungen an Ihrem nicht verwalteten Code vornehmen müssen Probleme zu lösen wie die Verpackung.
Migration und Serialisierung
Serialisierung ist der Prozess der Umwandlung des Zustands eines Objekts in eine Form, die anhielt oder transportiert werden kann. Das Komplement der Serialisierung ist Deserialisierung, die einen Strom in einen Gegenstand umwandelt. Zusammen ermöglichen diese Prozesse Daten einfach gespeichert und übertragen werden.
Das .NET Framework verfügt über zwei Serialisierung Technologien:
- Binäre Serialisierung bewahrt Typ Treue, die für die Erhaltung des Status eines Objekts zwischen verschiedenen Anrufungen einer Anwendung nützlich ist. Zum Beispiel können Sie ein Objekt zwischen verschiedenen Anwendungen teilen, indem sie es in die Zwischenablage Serialisierung. Sie können ein Objekt in einen Stream, auf eine Platte, in dem Speicher über das Netzwerk serialisiert wird, und so weiter. NET Remoting verwendet Serialisierung Objekte passieren „durch den Wert“ von einem Computer oder Anwendungsdomäne zu einer anderen.
- XML-Serialisierung serialisiert nur öffentliche Eigenschaften und Felder und nicht Art Treue bewahren. Dies ist nützlich, wenn Sie Daten zur Verfügung zu stellen oder konsumieren, ohne die Anwendung zu beschränken, die die Daten verwendet. Da XML ein offener Standard ist, ist es eine attraktive Wahl für Daten über das Web zu teilen. SOAP ist ebenfalls ein offener Standard, der es zu einer attraktiven Wahl macht.
Überlegungen zur Migration
Wenn wir über die Serialisierung denken müssen wir im Auge behalten, was wir zu erreichen versuchen. Eine Frage im Auge zu behalten, wie Sie auf 64-Bit-Migration ist, ob Sie beabsichtigen, serialisierten Informationen zwischen den verschiedenen Plattformen zu teilen. Mit anderen Worten, wird die 64-Bit-verwalteten Anwendung Lesen (oder deserialize) Informationen von einer Anwendung verwalten 32-Bit gespeichert.
Ihre Antwort wird dazu beitragen, die Komplexität Ihrer Lösung zu fahren.
Nach all dem, was sind die Überlegungen in Bezug auf die Serialisierung?
- IntPtr entweder 4 oder 8 Byte in der Länge abhängig von der Plattform. Wenn Sie die Informationen serialisiert dann sind Sie plattformspezifische Daten an den Ausgang zu schreiben. Das bedeutet, dass Sie und Probleme auftreten, wenn Sie diese Informationen zu teilen versuchen.
Migration auf 64-Bit kommt und Microsoft gearbeitet hat, um den Übergang von 32-Bit-verwalteten Anwendungen auf 64-Bit so einfach wie möglich zu machen.
Allerdings ist es unrealistisch, dass man einfach davon ausgehen, laufen kann 32-Bit-Code in einer 64-Bit-Umgebung und haben es laufen, ohne zu schauen, was Sie migrieren.
Wie bereits erwähnt, wenn Sie 100% Typ sicher verwalteten Code haben, dann können Sie wirklich kopieren Sie es einfach auf die 64-Bit-Plattform und es erfolgreich unter den 64-Bit-CLR ausgeführt werden.
Aber mehr als wahrscheinlich, die verwaltete Anwendung wird mit einem oder allen der folgenden einbezogen werden:
Unabhängig davon, welche dieser Dinge, die Ihre Anwendung tut es wichtig sein wird, Ihre Hausaufgaben zu machen und untersuchen, was Ihr Code tut und welche Abhängigkeiten Sie haben. Sobald Sie diese Hausaufgaben machen, werden Sie zu Ihrer Wahl aussehen müssen einige oder alle der folgenden Funktionen ausführen:
Sie sollten sich auch bewusst der Werkzeuge, die Sie in Ihrer Migration zur Verfügung zu unterstützen.
Es Bereich auch Bibliotheksfunktionen verwalten Sie zur Laufzeit zu unterstützen, um zu bestimmen, in welcher Umgebung Sie in ausgeführt werden.
- System.IntPtr.Size -Um festzustellen, ob Sie in 32-Bit- oder 64-Bit-Modus ausgeführt werden
- System.Reflection.Module.GetPEKind -bis programmatisch eine EXE-Abfrage oder DLL zu sehen, ob es gemeint ist, nur auf einer bestimmten Plattform laufen oder unter WOW64
Es gibt keine spezifische Reihe von Verfahren alle Herausforderungen zu begegnen, die Sie in laufen konnten. Dieses Whitepaper soll Ihr Bewusstsein für diese Herausforderungen erhöhen und Ihnen mögliche Alternativen zu präsentieren.
Show: Vererbte geschützte