314. 32bit, 64bit and in between

[נכתב ע”י עודד לזר]

יצא לי להתקל בבעיה עם הרמה של סרביס בשרת 64bit אתמול.

הסרביס עבד מעולה על שרת 32bit ולא ראיתי שום סיבה ממשית שהוא לא יעבוד על שרת 64bit, במיוחד כשיש WOW64 (אמולציה של 32bit)

למזלי הייתי בסדנת מיגרציה מ 32bit ל64bit ושם אלי אופק דיבר איתנו על תרחישים אפשריים בתהליך מיגרזציה שכזה ועל כלים ופתרונות לבעיות שעלולות לצוץ.

אז הנה כמה נקודות שכדאי שתכירו:

  1. מושגים בסיסיים:
    • 32bit – x86 (“תואמי אינטל 😃”)
    • 64bit:
      • x64
      • AMD64
      • EM64T
  2. כשאתם יוצרים solution בvisual studio אתם יכולים לבחור לאיזה platform הוא יתקמפל. המשמעות היא שאחרי שתקפלו יודלקו / לא יודלקו מס’ דגלים בclr header של הassembly וכאשר תריצו את הassembly הclr יסתכל על הדגלים האלו ויחליט כיצד לקמפל את הassembly.
  3. אם הassembly נטען לפלטפורמה מסוימת, גם כל הreferenced assemblies נטענים לאותה הפלטפורמה. ז”א שאם יש exe שעולה כ64bit גם כל הreferenced assemblies צריכים להיות ב64bit או anycpu (שזה אומר שהביט של ILONLY מודלק אבל לא 32bit required)
  4. אפשר להתסכל על הheader של הקובץ עם מס’ כלים, ביניהם:
    • corflags – מאפשר לראות ולערוך את clr header של assembly
    • dumpbin: מאפשר לראות headers של קובץ (לא בהכרח assembly)
  5. בtaskmanager אפשר לדעת אם exe עלה כ64bit או 32bit לפי כוכבית שיש ליד השם שלו.
  6. ל-Dependency walker יש גרסאת 32bit ו64bit ושימו לב שאם אתם רוצים לבדוק dependencies של קובץ, תרוצו עליו עם הגרסא הנכונה של dependency walker

אז איך זה מתחבר אלי? מסתבר שהסרביס שהרמתי קומפל לanycpu וכשהרצתי אותו על שרת 64bit הוא לא הצליח לטעון את אחד הassemblies שקומפל לx86 (ולא לanycpu / x64)

תודה,

שתף