2009-03-12 28 views
5

Tôi đang lên kế hoạch nâng cấp một ứng dụng vb6 lớn lên .net. Dự án sử dụng nhiều thành phần của bên thứ ba, ví dụ như VSFlexGrid cũng như các báo cáo tinh thể. Nó cũng sử dụng dll VB6 cũ có mã nguồn không có sẵn. Câu hỏi của tôi làCác công cụ phát triển tốt nhất để nâng cấp từ VB6.0

  1. Tôi có nên chuyển đổi nguồn thành C# hoặc VB.net đủ mạnh không? Tôi phải làm gì với các thành phần của bên thứ ba không được hỗ trợ hoặc sử dụng các công nghệ không an toàn/lỗi thời?

Tôi sẽ hoan nghênh mọi thông tin hữu ích từ bất kỳ ai đã thực hiện việc này trước đây.

Trả lời

7

Dưới đây là sự thích nghi của một số couple trong số answers của tôi cho các câu hỏi tương tự.

Tự động chuyển đổi là lựa chọn tốt hơn viết lại. Đó là một lỗ hổng phổ biến để bắt đầu viết lại một phần mềm lớn một cách lạc quan, tạo nên những tiến bộ tốt trong việc sửa chữa một số lỗ hổng nổi tiếng trong kiến ​​trúc cũ, và sau đó bị sa lầy trong chức năng mà bạn đã sử dụng trong nhiều năm . Tại thời điểm này quản lý của bạn bắt đầu nhận được twitchy và tất cả mọi thứ có thể nhận được rất khó chịu.

... và đây là một bài viết trên blog của một Microsofty rằng agrees with me:

Nhiều công ty tôi làm việc với trong những ngày đầu của .NET nhìn đầu tiên tại viết lại thúc đẩy một phần bởi một mong muốn mạnh mẽ để cải thiện kiến trúc và cấu trúc mã cơ bản cùng lúc khi chúng chuyển sang .NET. Thật không may, nhiều dự án đã gặp khó khăn và một số dự án chưa bao giờ hoàn thành. Vấn đề họ đã cố gắng để giải quyết là quá lớn

này tuyệt vời Microsoft page khuyến cáo hai công cụ của bên thứ ba như di cư tốt hơn so với (không còn available) được xây dựng trong VB.NET nâng cấp thuật sĩ - Artinsoft và CodeArchitects VBMigration. Tôi tin rằng họ có một số hỗ trợ cho các điều khiển bên thứ ba phổ biến và các tệp DLL - Artinsoft suport these. Nó sẽ là giá trị liên hệ với họ với một danh sách các phụ thuộc của bạn. VBMigration có một số free tool sẽ liệt kê các phụ thuộc chỉ vì lý do này. Cũng đáng liên hệ với các nhà cung cấp ban đầu với hy vọng tương đương với .NET.

Trang Microsoft cũng cho biết:

Performing viết lại hoàn toàn để NET được thêm rất nhiều tốn kém và khó khăn để làm tốt [hơn chuyển đổi] ... chúng tôi chỉ muốn giới thiệu phương pháp này cho một số ít tình huống.

Có rất nhiều nhà phát triển C# hơn nhà phát triển VB.NET trên Stack Overflow, vì vậy bạn có thể sẽ nhận được một số câu trả lời đề xuất C#. Cũng trong lịch sử Microsoft đã có xu hướng hỗ trợ C# nhiệt tình hơn về các ví dụ mã cho các phần mới của .NET và vân vân. Nhưng Microsoft hiện nay assure chúng tôi rằng:

Cả hai [C# và VB.NET] là ngôn ngữ lập trình bậc nhất dựa trên Microsoft .NET Framework và chúng đều mạnh mẽ như nhau.

Vì vậy, đó là quyết định cá nhân cho dù bạn muốn chọn C# hoặc VB.NET. Công cụ Artinsoft tuyên bố nó có thể chuyển đổi VB6 thành C#.


EDIT: Tôi vừa tìm thấy một đề nghị khác - NewCode - thông qua quảng cáo trên trang web lập trình!

Nhận định nhanh của tôi là trang web không chi tiết như hai đối thủ cạnh tranh tôi đã viết ở trên. Điều đó có thể không công bằng. Một số người ở Microsoft Ireland blogged về họ - Tôi nghĩ họ có trụ sở tại Ireland. Dường như công cụ chuyển đổi VB6 của bạn thành DSL và sau đó đến VB.NET Winforms, C#, WPF, Java ...

3

Nâng cấp; ngay cả khi công cụ cơ khí tồn tại, điều này sẽ không thực sự làm nhiều cho bạn. Nó sẽ không làm cho nó phù hợp một cách kỳ diệu với .NET, hoặc sử dụng khung công tác khá tốt. Tôi luôn muốn viết lại trong kịch bản này, nhưng điều đó có rủi ro/chi phí liên quan. Ví dụ, một số đồng nghiệp của tôi hiện đang viết lại một số mã VB6/ASP/COM +/xslt để sử dụng ASP.NET MVC - hầu hết mã "thú vị" thực sự là logic nghiệp vụ, không phải là rất khó để cổng (lừa đang thử nghiệm nó ;-p). Nó giúp bố cục mã VB6 của chúng ta là chi tiết, cho phép chúng ta di chuyển các slice riêng lẻ, mà không cần phải đẩy toàn bộ cùng một lúc.

Kiểm soát của bên thứ ba sẽ là một mối phiền toái và có vẻ như các dll khác có thể phải được thiết kế ngược. Không tầm thường.

Lựa chọn giữa C# và VB.NET phần lớn là phụ. Cả hai đều có một số lợi thế nhỏ, nhưng tổng thể bạn có thể làm hầu hết mọi thứ với một trong hai. Nếu bạn cần COM interop, thì VB.NET có thể hữu ích (hoặc cho mọi thứ, hoặc chỉ là một assembly cụ thể) - nhưng C# 4.0 (trong VS2010) sẽ cắm khoảng trống này thông qua việc gõ dynamic mới và các thay đổi không có PIA. Nhìn chung, tôi bao la thích C#, nhưng đó phải là quyết định địa phương.

+0

Trước khi bắt tay vào viết lại: có ước tính công ty trước tiên - có thể sử dụng số dòng mã VB6 làm hướng dẫn. Và đảm bảo quản lý của bạn hoàn toàn trên tàu. Và lấy một số giải quyết xung đột đào tạo chỉ trong trường hợp :) Tôi đã bắt đầu xuống đường như thế này và đã đến một số nơi khó chịu. – MarkJ

2

tôi nói về vấn đề này here

Bước đầu tiên và quan trọng nhất là làm cho ứng dụng hiện tại của bạn như .NET như bạn có thể. Bất cứ điều gì VB6 cụ thể hoặc dựa vào một điều khiển bên thứ 3 nhận được càng nhiều của nó đằng sau giao diện như bạn có thể. Giao diện sẽ hiển thị chính xác những gì bạn đang sử dụng công cụ của bên thứ 3 và hành vi nào trước tiên. Bằng cách làm điều này trong VB6 đầu tiên bạn có thể chạy thử nghiệm đơn vị và tích hợp đảm bảo rằng hành vi được bảo tồn. Đó là yếu tố quan trọng mà hành vi của ứng dụng của bạn được bảo tồn.

Đối với vấn đề giữa C# và VB.NET. Có sự khác biệt về mặt chức năng giữa hai ngôn ngữ. Một trong những dự án chuyển đổi của tôi trở lại vào những năm 90 đã lấy ứng dụng CAD/CAM của Công ty tôi từ một phương ngữ BASIC được gọi là Rocky Mountain BASIC vào Visual Basic 3. Chúng tôi đã có một vài khởi đầu sai trước đó và cảm thấy sau đó đã chứng minh với chúng tôi rằng là dễ dàng hơn để bảo tồn hành vi bằng cách chuyển sang một ngôn ngữ gia đình BASIC khác hơn là chuyển đổi qua một họ ngôn ngữ hoàn toàn khác như C.

Hiểu được trường hợp của chúng ta có rất nhiều toán học và toán học nặng là một trong số ít các lĩnh vực vẫn còn tương đối phù hợp với gia đình ngôn ngữ BASIC. Vì vậy, kinh nghiệm của tôi không phải là 100% áp dụng cho trường hợp của bạn.

Đó là ý kiến ​​của tôi rằng sự nhạy cảm của ngôn ngữ kiểu C là một thiệt hại cho khả năng bảo trì lâu dài (thập kỷ). Tuy nhiên để công bằng nó là một điểm nhỏ nhất. Tôi có nhiều kinh nghiệm trong cả hai ngôn ngữ khi viết và duy trì mô phỏng của Mercury và Gemini Space Capsule viết bằng C++ với một số tiện ích được viết bằng C# ngoài chương trình CAD/CAM trong VB6/VB.NET cho công ty của tôi.

Ngay bây giờ của chúng tôi.NET chuyển đổi tập trung vào VB.NET. Tôi thấy các công cụ tự động gần như vô dụng vì chúng tôi là một chương trình đồ họa có định hướng nặng. May mắn thay, chúng tôi không sử dụng các cuộc gọi VB Graphics trực tiếp nhưng đặt mọi thứ phía sau một giao diện canvas. Để tương thích in, chúng tôi sử dụng Thư viện tương thích máy in từ VB Power Pack làm điểm bắt đầu.

Chúng tôi có một công cụ mà chúng tôi chạy mã của chúng tôi thông qua đó chuyển đổi tất cả các số nguyên để nhập Int16 và tất cả các loại dài để nhập Int32 cộng với một số chuyển đổi thường được thực hiện khác. Sau đó, chúng tôi đặt lớp chuyển đổi hoặc thường trình vào thư viện .NET của chúng tôi và chạy các bài kiểm tra đơn vị. Các kết quả được so sánh với các thử nghiệm tương tự chạy trên mã VB6 gốc.

Nỗi đau lớn nhất ở mông là các biểu mẫu. Hộp thoại đơn giản là OK nhưng đối với các hình thức phức tạp hơn, chúng ta chỉ cần thực hiện lại. Một lần nữa các biểu mẫu của chúng tôi nằm phía sau các giao diện trong mã ban đầu của chúng tôi, do đó, trong khi nó hoạt động thì chúng tôi rất đơn giản để xem phải làm gì.

0

Bạn sẽ không thích câu trả lời của tôi nhưng ở đây.

a) Thuê người có kinh nghiệm đáng kể trong việc xây dựng các ứng dụng .Net lớn để đến và hướng dẫn dự án và hướng dẫn bạn.

b) Trích xuất các yêu cầu nghiệp vụ từ ứng dụng hiện tại của bạn và đóng băng chúng.

c) Hãy tôn vinh thực tế rằng đây sẽ là dự án phát triển ứng dụng Greenfield dễ nhất từ ​​trước đến nay bởi vì bạn có người có kinh nghiệm trong công nghệ hướng dẫn bạn, bạn có công cụ trưởng thành để xây dựng ứng dụng và có một bộ yêu cầu được xác định rõ , vì vậy bạn biết chính xác những gì cần xây dựng.

P.S. Tại thời điểm này tôi sẽ không bận tâm với Winforms. Tôi sẽ chuyển thẳng đến WPF, bạn sẽ cảm ơn tôi sau.

P.P.S Ngôn ngữ thực sự không quan trọng (C# hoặc VB.Net). Nỗ lực sẽ giống nhau.

+0

Và có một ước tính vững chắc trước khi bạn bắt đầu - có thể sử dụng số dòng mã VB6 làm hướng dẫn. Và đảm bảo quản lý của bạn hoàn toàn trên tàu. Và lấy một số giải quyết xung đột đào tạo chỉ trong trường hợp :) Tôi đã bắt đầu xuống đường như thế này và đã đến một số nơi khó chịu. – MarkJ

1

Tôi đã bắt đầu làm lại một trong các ứng dụng của công ty tôi được viết bằng VB6 đến VB.NET. Cả C# và VB.NET đều dựa trên .NET framework, và sự khác biệt giữa một ứng dụng được biên dịch trong cả hai là không đáng kể. Chọn ngôn ngữ bạn và những người khác làm việc trên dự án sẽ cảm thấy thoải mái hơn. Một lợi thế để sử dụng VB.NET (mặc dù tôi đang do dự để gọi nó như vậy) là bạn có thể sử dụng "Nâng cấp Visual Basic 6 Mã" tính năng trong Visual Studio. Có một số thứ mà công cụ chuyển đổi sửa chữa và rất nhiều thứ không có. Nếu bạn muốn thử điều này, bạn sẽ phải dọn dẹp mã VB6 của bạn:

  • Tất cả các mảng cần phải zero dựa
  • Tránh sử dụng chuỗi dài cố định nếu có thể. Mã này sẽ phải được thay đổi để sử dụng mảng Char trong vb.net
  • Khai báo rõ ràng tất cả các biến. Sử dụng Option Explicit nếu bạn chưa
  • Tránh các biến thể như bệnh dịch hạch, trừ khi bạn hoàn toàn phải sử dụng một cho một cuộc gọi API
  • Chỉ định ByRef hoặc ByVal khi đi qua các thông số, không dựa vào hành vi mặc định cho
  • này
  • Luôn chỉ định thuộc tính bạn đang thay đổi, thuộc tính mặc định không tồn tại trong vb.net. Ví dụ "txtName = strName" trở thành "txtName.Text = strName"
  • Một chi tiết hơn nhiều danh sách những khác biệt này có thể được tìm thấy here

Ngay cả sau khi dọn dẹp mã hiện tại là tốt nhất bạn có thể, việc chuyển đổi vẫn isn 't 100%. Bạn có thể thử điều này trong một dự án riêng biệt chỉ để xem những gì bạn nhận được để cung cấp cho bạn những ý tưởng về cách mọi thứ cần phải được làm lại.Đôi khi các biểu mẫu trông xấu xí sau một chuyển đổi, và đối với một số điều bạn có thể sẽ kết thúc chúng lại từ đầu.

Rất nhiều biểu mẫu của chúng tôi đã sử dụng nhiều tài sản ItemData trong hộp tổ hợp và hộp danh sách không còn tồn tại trong .NET. ListViews cũng hoạt động khác nhau và không có hàm vẽ nào giống nhau. Một số hình thức từ các ứng dụng tôi chuyển đổi chỉ trông thực sự xấu khi chuyển đổi để điều khiển .NET và đã không hành xử theo cùng một cách, vì vậy tôi chỉ sẽ kết thúc làm lại từ đầu. Lợi thế là tôi có thể làm lại các quy trình không hiệu quả lắm, nhưng tất nhiên điều này mất nhiều thời gian hơn. Cặp vợ chồng mà với thực tế tôi vẫn đang học tập những gì các thư viện khác nhau. NET làm ... yeah nó sẽ mất một thời gian.

+0

Chắc chắn nó không quá khó để làm việc vòng ItemData? Ví dụ thử này (chỉ cần google nó, không thử nó) http://www.mgbrown.com/PermaLink37.aspx – MarkJ

+0

@MarkJ - Tôi đã kết thúc làm việc xung quanh vấn đề bằng cách sử dụng một phương pháp rất giống với một trong đó. :) –

+0

Francesco Balena đưa ra một giải pháp ngọt ngào cho các mảng không bị ràng buộc bằng không trong VB.NET sử dụng Generics: http://www.dotnet2themax.com/blogs/fbalena/PermaLink,guid,08e740fc-f486-4b5b-8796- 6aad43e08815.aspx – MarkJ

2

Tôi sẽ đề nghị bạn 'viết lại một phần' ứng dụng của bạn. Tên ưa thích của phương pháp này là bóp cổ (http://martinfowler.com/bliki/StranglerApplication.html).

Tôi đoán là ứng dụng cơ sở dữ liệu. Xem bạn có thể viết lại một số tính năng bằng cách nói chuyện trực tiếp với DB không. Đừng lo lắng về việc có người dùng sử dụng hai ứng dụng. Ứng dụng cũ là đủ xấu để họ yêu cầu cập nhật.

Đoán khác của tôi là vì nó là VB6, nó không có sự tách biệt UI/BusinessLogic rất tốt. Đó là lý do tại sao tự động nâng cấp sẽ không giúp bạn quá nhiều.

Có thể tôi đã sai về hoàn cảnh của bạn. Bạn cần phải hỏi bạn có bao nhiêu bạn thực sự có thể nhận được ra khỏi mã hiện có. Mua/Đọc cuốn sách mã kế thừa của Michael Feather.

0

Câu hỏi đặt ra là yêu cầu thông tin về “Công cụ phát triển tốt nhất để nâng cấp từ VB6.0” cho bản nâng cấp VB6/COM phức tạp và thứ hai về C# hoặc VB.NET.

Một hoàn hảo “chuyển đổi” công cụ sẽ giúp bạn đáp ứng được hai mục tiêu quan trọng của tất cả các nâng cấp

  1. Bảo tồn chức năng
  2. Lợi dụng .NET một cách rằng sau mã hóa mong muốn của bạn và tiêu chuẩn phụ thuộc nền tảng

vai trò của công cụ trong Bảo tồn năng

Các hệ thống kế thừa lớn, trưởng thành có thể chứa hàng nghìn tệp mã và hàng triệu dòng mã. Nỗ lực cần thiết để mô tả đầy đủ và xác minh chức năng thể hiện trong nhiều mã là rất lớn. Trong thực tế, có thể có rất nhiều công việc chức năng mà một số nhóm có đầu óc kỹ thuật không nhìn thấy nó lúc đầu. Họ dành phần lớn thời gian của họ lo lắng về cách tận dụng lợi thế của các tính năng thiết kế, ngôn ngữ và khuôn khổ .NET mới nhất trước khi họ đánh giá đầy đủ mức độ khó bảo tồn và xác minh chức năng cũ. Nó giống như họ đang đánh cá từ phía sau của một con cá voi chức năng khổng lồ trong khi lo lắng về việc bắt cá ít kỹ thuật.

Đội cố gắng tái tạo một mã núi bằng cách đọc, giải thích và mã hóa thủ công cũng có thể bị mù trong quá trình… Vì vậy, một tính năng quan trọng của bất kỳ công cụ chuyển đổi nào là giúp nhóm đọc, giải thích và viết lại mã trong khi viết lại nó trong một biểu mẫu bảo tồn ngữ nghĩa của nó. Các nhà khoa học máy tính đã nghiên cứu vấn đề đọc hiểu, và viết lại mã nguồn trong hơn 60 năm và giải pháp mà họ đưa ra được gọi là trình biên dịch. Một “trình biến đổi” có hiệu quả hoạt động như một trình biên dịch. VB2 là một ngôn ngữ cấp cao: trình biên dịch VB6 của Microsoft và thời gian chạy của nó đã vô số điều: quản lý suy luận kiểu, chuyển đổi ngầm, ngầm bởi ref, các cuộc gọi bị ràng buộc trễ, xử lý null, xử lý lỗi kiểu goto, thiết kế biểu mẫu, v.v.Một bộ chuyển đổi VB6 cũng phải có khả năng nhận ra và lưu trữ vô số chi tiết nhỏ không rõ ràng trong mã và nó phải có khả năng thể hiện chính xác những chi tiết đó trong .NET. Một công cụ chuyển đổi sức mạnh công nghiệp sẽ có một hệ thống ngôn ngữ kim loại VB6 mạnh mẽ, mở rộng cho phép người dùng kiểm soát cách mã VB6 được nhận ra và diễn giải.

VB6 cũng dễ dàng mở rộng thông qua COM. Có rất nhiều hàng trăm API COM khác nhau đang được sử dụng và không tính tất cả các thành phần nội bộ thường trở thành một phần của các hệ thống doanh nghiệp. Bộ chuyển đổi phải có khả năng nhận ra bất kỳ lớp COM hoặc điều khiển nào được VB6 sử dụng, cả trong thiết kế giao diện người dùng lẫn mã và thể hiện nó bằng cách sử dụng một số .NET API hoặc interop thích hợp khác. Một công cụ tôi biết thậm chí có thể tạo ra một khuôn khổ mã .NET từ thông tin sử dụng COM trong VB6. Một công cụ chuyển đổi sức mạnh công nghiệp sẽ có một hệ thống kiểu COM mạnh mẽ có thể mở rộng và cho phép người dùng kiểm soát cách COM được thay thế trong mã được tạo ra.

Vai trò của công cụ trong Lợi dụng .NET

VB6 và .NET là khác nhau bằng nhiều cách và như vậy là các API khác nhau mà hỗ trợ hai nền tảng. Vì vậy, với các công cụ hoặc không có, sẽ hầu như luôn có một số thiết kế lại được yêu cầu. Hơn nữa, mỗi nhóm mang lại các sở thích, ràng buộc và yêu cầu khác nhau cho dự án của họ: yêu cầu 10 chương trình làm thế nào để mã hóa một cái gì đó và bạn sẽ nhận được ít nhất 10 câu trả lời khác nhau. Trình biến đổi phải giúp nhóm thể hiện các sở thích, ràng buộc và yêu cầu duy nhất của nó. Điều này bao gồm việc cung cấp các phương thức sửa đổi, tự viết mã VB6 trước khi nó được xử lý, sửa đổi mã .NET sau khi nó được tạo ra, tích hợp mã viết tay, mô tả các thay thế API tùy chỉnh, chuyển đổi mã tùy chỉnh và thực hiện nhiều dự án khác biến đổi đặc thù theo yêu cầu.

Đưa nó tất cả cùng nhau

Một nâng cấp lớn hiếm khi được dự đoán đầy đủ và lên kế hoạch trước. Ngay cả với kiến ​​thức sâu rộng về cả mã nguồn và các tiêu chuẩn mã hóa .NET mong muốn, sẽ có nhiều vấn đề và cơ hội xuất hiện trong công việc. Mã nguồn và các yêu cầu phải được phép thay đổi trong suốt quá trình nâng cấp. Điều cần thiết là một phương pháp nhanh nhẹn cho phép nhóm thích ứng với các thay đổi mã nguồn, thử nghiệm với các kỹ thuật mã hóa .NET khác nhau. Một công cụ chuyển đổi sức mạnh công nghiệp sẽ có độ chính xác, độ chính xác, tính linh hoạt và tốc độ để cho phép loại phương pháp này.

Một nhận xét khác về Công cụ chuyển đổi. Công cụ quan trọng nhất mà bạn sẽ sử dụng trong bản nâng cấp .NET là bộ não của bạn. Bạn phải học các ngôn ngữ .NET, các mẫu thiết kế và các khung công tác và áp dụng những gì bạn biết trong nỗ lực nâng cấp của mình. Công cụ tự động tốt nhất không quyết định cho bạn cách viết lại mã của bạn: nó giúp bạn triển khai lại chức năng cũ theo thiết kế mà bạn quyết định có ý nghĩa.

Microsoft đề xuất một số công cụ trong bài viết này. VB6 Upgrade Partner Tools

VB.NET hoặc C#

Khi tôi đề nghị cộng đồng NET (tức là tìm kiếm trên web) để biết thông tin, công cụ, ý tưởng, mã, và giúp đỡ về vấn đề lập trình, tôi nhiều khả năng tìm câu trả lời được thể hiện bằng C# so với VB.NET. Tôi cũng tìm thấy trình biên dịch C# phù hợp hơn với công cụ viết lại nhờ công cụ vì nó yêu cầu mã được tạo ra phải phù hợp hơn và được mô tả rõ ràng hơn. Bắt và giữ xây dựng là một thử nghiệm hơi thô lỗ, nhưng hoàn toàn quan trọng về chất lượng mã và là một mốc quan trọng trong mọi nỗ lực nâng cấp. Hãy nhớ rằng VB.NET không phải là VB6.Điều này nghe có vẻ hiển nhiên, nhưng có thể khó nhớ vì hai ngôn ngữ trông giống nhau. Sự giống nhau này có thể lừa dối; vì vậy IMO nó là tốt hơn để đi đến C# nơi bạn được nhắc nhở rằng các quy tắc là khác nhau. Cuối cùng, C# luôn được và tiếp tục được thiết kế cho .NET; VB.NET không thể nói điều đó.

Tuyên bố từ chối trách nhiệm: Tôi làm việc cho Di chuyển tuyệt vời. Có rất nhiều điều để thảo luận. Vui lòng truy cập Great Migrations Documentation Portal để biết thêm các bài viết và để nhận thử nghiệm gmStudio và thử một công cụ nâng cấp sức mạnh công nghiệp cho chính bạn.

Các vấn đề liên quan