DCSIMG
עמוד הבית| חבילות השירות שלנו| חומר חופשי| צור קשר
ארכיטקט-ידיים-מלוכלכות, מס’ 5 – שימור רכיבי VB6 בעידן ה-WCF - בלוג היועצים של מיקרוסופט ישראל

בלוג היועצים של מיקרוסופט ישראל

ארכיטקט-ידיים-מלוכלכות, מס’ 5 – שימור רכיבי VB6 בעידן ה-WCF

Alik Levin     השקעת שנם בלפתח את הרכיבים שלך ב-VB6 ועכשיו אתה מתלבט מה לעשות איתם. יש מצב?

בזמן שאתה מלבט אתה חייב להמשיך לפתח יכולות חדשות וגם להשתמש בקיימות. יש מצב?

אחד ההתלבטויות זה איך לחסוף  את הפונקציונאליות הקיימת המפותח ב-VB6 כשירותי WCF. יש מצב?

תסריט מס’ 1 – חשיפת VB6 כשירות WCF

הדרך הכי פשוטה לטעמי היא לפתח את שירות ה-WCF ב-Net Fx, לעשות Reference לרכיב ה-COM שלי וגמרנו. כאשר עושים Reference ל-COM אז VS יוצר שכבת אינטגרציה בין COM ל-Net Fx הנקרא Runtime Callable Wrapper או RCW שדרכו רכיב ה-COM מופעל ע”י רכיב Net Fx.

אני מעדיף ליצור את שכבת ה-RCW באופן ידני בגלל שזה נותן יכולות שליטה רחבות יותר – כמו חתימה עם SNK וגם בגלל שזה כיף יותר – LOL.

הנה השלבים:

  1. צור רכיב VB6 בעזרת Visual Basic 6.0 [אחחחח, נוסטלגיה :)]
  2. צור RCW בעזרת TLBIMP תוך כדי חתימה עם SNK
    c:\>tlbimp C:\VB6ProjectLibrary.dll" /keyfile:"C:\VB6WrapperKey.snk" /out:"C:\\NetWrapper.VB6ProjectLibrary.dll
  3. מתוך פרויקט של Net Fx צור Reference ל-Wrapper שיצרת [NetWrapper.VB6ProjectLibrary.dll]
  4. תפעיל את הרכיב בתוך try, תפוס Exceptions ב-catch והכי חשוב [!!!] זה מה תכתוב ב-finally:

    // Make sure that the underlying COM object is immediately freed
    while (System.Runtime.InteropServices.Marshal.ReleaseComObject(vb6Class) != 0) ;
    //FOR NET FX 2.0 and UP
    //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(vb6Class) ;

תסריט מס’ 2 – צריכת WCF ע”י VB6

הדרך שאני חושב הכי כיפית היא לצרוך WCF ע”י רכיב .Net Fx ואת רכיב Net Fx לחשוף לצריכה ל-COM. הנה השלבים לחשיפת רכיב Net Fx לצריכה ל-COM:

  1. צור Interface עם attributes שיאפשרו צריכה בעולם ה-COM:
    [Guid("E0281197-1174-4d48-92EA-19FFC3B4EF63")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface _COMCallableClass

  2. צור Type שיורש מה-Interface עם עוד כמה attributes – אתה בטח מזהה מה יהיה השימוש של ה-Attributes
    [Guid("2CA46DE2-0502-4ae9-9763-D57EFA3E9457")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("COMCallableNetComponent.COMCallableClass")]
    public class COMCallableClass : _COMCallableClass
  3. תסמן את הרכיב כ-COM Visible
    clip_image001
  4. רשום את הרכיב לצורך צריכה בעולם ה-COM
    C:\>regasm /codebase "C:\COMCallableNetComponent.dll" /tlb:"C:\ COMCallableNetComponent.tlb"
  5. אופציונאלי – אתה יכול לרשום אותו ב-GAC בעזרת gacutil
  6. בסביבת VB 6 תוסיף reference לרכיב שלך:
    clip_image002
  7. תפעיל בתוך הקוד של VB6 שלך:
    clip_image001[5]

איך אתה משמר את רכיבים ה-VB 6 שלך? איך אתה מתכנן לבצע מיגרציה מ-VB 6?

שירותי MCS רלוונטיים

חומר רלוונטי

 

שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

 

This template is made with PracticeThis.com plugin for Windows Live Writer

תוכן התגובה

Danny Cohen כתב/ה:

העובדה שמבחינה טכנולוגית ניתן לבצע משהו, אינה מהווה אסמכתא לכך שצריך לבצע אותו...

אליק - זה אחלה פוסט, תוכן מצוין מבחינה טכנית, אבל מכל בחינה אחרת, אני רוצה לזעוק "לא! אל תעשה זאת... אתה עדיין צעיר, וכל חייך לפניך! חבל..."

קודם כל, חשוב לציין שהתמיכה של מיקרוסופט ב - VB6 פגה:

msdn.microsoft.com/.../ms788707.aspx

מעבר לזה, ישנם היבטים רבים של VB6 שמהווים... איך ננסח זאת... אתגר, כאשר עובדים איתם כיום.

לדוגמא, העובדה שכל רכיב VB6 הינו appartment threaded ולפיכך single threaded הינה נקודה חשובה שיש לשקול ולהבין בכל תסריט, כולל תסריט של כמעט כל אפליקציה מודרנית שכוללת multi-threaded & concurrency  באופן מובנה.

כתוצאה, לפני השאלה של "האם אני יכול מבחינה טכנית לעשות שימוש ברכיבי VB6 שלי ?" צריך לשאול את השאלה "האם אני בכלל רוצה לעשות שימוש ברכיבים אלו", תוך הפעלת שיקול דעת רחב לגבי חסרונותיהם בהיבטי תמיכה, ביצועים, סקלביליות, ידע ועוד.

# January 18, 2010 11:01 AM

alikl כתב/ה:

דני,

איך לעשות מגרציה של VB6 לטכנולוגיה עדכנית בלי לפגוע בפעילות שותפת של האירגון?

# January 18, 2010 12:10 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 5 and 6 and type the answer here:


Enter the numbers above: