MS_VB6ToVBNETFAQ - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

VB6→VB.NET移行 FAQ

抂芁

VB6 → VB.NET 移行の FAQ を纏めおいたす。

前提ずなる芋積方法

暙準䞀括

ストレヌト・コンバヌゞョンの堎合、
䞀般的な工皋別・工数比率からテスト工数のみを積んだ

  • 芋積工数が新芏開発の 0.4 - 0.5 倍になりたす。
  • 逆数を取るず生産性は 2.0 - 2.5 倍ずなりたす。

この数字は、実瞟移行芋積もりの抂芁 の
前提の工数比率からも合っおいるず思いたす。

問題は、

  • VB6 → VB.NET の倉換率であり、この倉換率が䜎くなるず、
    䞊蚘のテスト工数に加えポヌティング䜜業工数が増加するこずです。

  • 倉換率が䜎くなるに぀れ、テスト工数・ポヌティング䜜業工数が増加し、
    新芏開発に近い工数、堎合によっおは、それ以䞊の工数になる可胜性がありたす。

VB6 → VB.NET 移行の総工数に、新芏時の工数の
0.4 - 0.5 倍  1.0 倍  1.x 倍の幅があるこずです。

そのような問題を事前に怜知するための倉換率の調査ですが、
ポヌティング䜜業工数に぀いおは正確なこずが蚀えないので、
正確な芋積もりを出すためには、幟぀かサンプリングしお移行性評䟡を実斜する必芁がありたす。

  • たず、倉換率調査の段階で、
    お客様の予算に合うかどうかがあり、

  • プロゞェクトを進めるこずができる堎合は、
    さらに移行性評䟡を実斜し、芋積もり粟床を䞊げる必芁がありたす。

準委任

準委任䜜業ずするこずで、顧客予算内に収たるサヌビスずするこずは可胜です。

䞀般的な工皋別・工数比率からテスト工数のみを積んだ芋積工数が新芏開発の 0.4 - 0.5 倍

ずいう慣䟋に埓うのは、通垞、品質保蚌皌働たでの責任を負うのためです。
暙準契玄曞の怜査・瑕疵担保責任・責任の範囲の項を参照。

ポヌティング䜜業䜜業支揎のサヌビスず割り切り、怜収頂けるなら
䞊蚘の工数を圧瞮し、顧客予算内に収たるサヌビスを提䟛するこずは可胜です。
泚意倉換率によりポヌティング工数は倉わる。怜収条件等は別途怜蚎が必芁になる。

補足契玄甚語の最新化「瑕疵担保責任」は無くなった: 䞊蚘の
契玄に関する蚘述は、2020 幎の民法改正で甚語ず枠組みが倉わっおいる。

【民法改正2020幎4月1日斜行】★
   旧【瑕疵担保責任】
     → 新【契玄䞍適合責任】★

   䞻な違い
     ・買䞻発泚者が請求できる手段が拡充された
         远完請求修補・代替代金枛額請求
         損害賠償解陀
     ・期間制限
         旧匕枡しから 1 幎以内に【暩利行䜿】
         新䞍適合を【知った時から 1 幎以内に通知】★
             通知だけでよい
     ・「隠れた」瑕疵ずいう芁件が【なくなった】

   → 契玄曞のひな圢IPA モデル契玄等も
     すべお「契玄䞍適合」に改蚂されおいる ★
【請負ず準委任の区別も敎理された】
   ・請負          
 【仕事の完成】に察しお報酬
   ・準委任履行割合型
                   
 【work したこず】に察しお報酬埓来型
   ・準委任成果完成型★改正で明文化
                   
 成果の匕枡しに察しお報酬
                     → 請負に近いが、
                       契玄䞍適合責任は負わない

   → 本ペヌゞが述べる
     「ポヌティング䜜業支揎ずしお準委任で受ける」
     ずいう敎理は【今も有効】だが、
     どちらの準委任かを契玄曞で明瀺すべきである ★

Q&A

再構築したほうが良い等の倉換率の指暙はあるのでしょうか

Q

䞀般的にはどのくらいの倉換率だず再構築したほうが良い等の指暙はあるのでしょうか

A

ポヌティング工数次第だず思いたす。ただ、倉換率に比䟋しないケヌスが倚いので、

䜎めの倉換率でも簡単な類䌌を修正しおいくこずで察応出来るようなケヌスもある。

実際には、ポヌティング工数がどの皋床になるかの
移行性評䟡䜜業をしおもらっお芋積もっお貰うのが良いず思いたす。

私が知るかぎりの移行完了䟋で倉換率 75%-70% 皋床の䟋がありたす。

䞊蚘、「簡単な類䌌を修正」郚分を単玔倉換できるケヌスは
アップグレヌドりィザヌドを掛けた埌のコヌドに察しお
自䜜ツヌルで倉換しお倉換率を䞊げるこずもあるようです。

65を䞋回るず少々難しくなっおくるように思いたす。

移行メモ誀字: 移行元の「アップグレヌドりィザヌドを曞けた埌のコヌド」を
「掛けた埌のコヌド」に修正した。

補足アップグレヌド りィザヌドは既に存圚しない: この Q&A が前提ずする
ツヌルは、Visual Studio から削陀されおいる。

【アップグレヌド りィザヌドの提䟛状況】★
   ・Visual Studio 2005 / 2008 に同梱
   ・【Visual Studio 2010 で削陀された】★
     → 以降の VS では VB6 プロゞェクトを開けない

【珟圚の遞択肢】
 ① 【VS 2008 を甚意しお倉換 → 新しい VS で開く】
     → 2 段階倉換。今でも実務で䜿われる手 ★
     → ただし VS 2008 自䜓がサポヌト切れ
 ② 【商甚の移行ツヌル】
     ・Mobilize.Net / VBUCVB Upgrade Companion
       → アップグレヌド りィザヌドより
         倉換率が高いずされる
       → 【.NET Core / C# ぞの倉換】にも察応 ★
     ・その他ベンダヌ各瀟の移行サヌビス
 ③ 【手動での曞き盎し】
     → 画面数が少ない、あるいは
       業務ロゞックの棚卞しを兌ねるなら珟実的
【VB6 ランタむムの珟況】★
   ・VB6 の【IDE はサポヌト終了】2008幎
   ・【ランタむムは Windows に同梱され、
     Windows のサポヌト期間䞭は動く】★
     → Windows 11 でも VB6 アプリは動䜜する
     → 「動くから移行しない」刀断が
       塩挬けを長期化させおきた
   ・ただし
     - 64bit 化できない32bit プロセスのたた
     - 䜿っおいる OCX / COM の方が先に死ぬ
     - 開発できる技術者が枯枇する ★
     → 【リスクは幎々䞊がっおいる】
【「倉換率」ずいう指暙の読み方】★
   本ペヌゞの
   「倉換率に比䟋しないケヌスが倚い」
   ずいう指摘は【極めお重芁】である。

     ・倉換率 90% でも、
       残り 10% が【アヌキテクチャの根幹】なら
       䟋独自の画面遷移制埡、ActiveX 䟝存の垳祚
       工数は跳ね䞊がる
     ・倉換率 70% でも、
       残りが【機械的な眮換の繰り返し】なら
       自䜜ツヌルで䞀気に片付く

   → 倉換率は【スクリヌニング】の指暙であっお、
     芋積もりの根拠にはならない
   → 本ペヌゞが「サンプリングしお移行性評䟡」を
     匷く勧めおいるのは、この理由による ★

ActiveXは.NETに倉換できないのですか

Q

たた、ActiveX を倚く䜿甚しおいるため倉換率が䜎くなるずいう話を聞きたした。

ActiveX は .NET に倉換できないのですか
盞互運甚機胜を提䟛するラッパヌクラスがあれば利甚可胜で、
このラッパヌクラスは自動生成されるずいう蚘事を芋かけたのですが...。

A

ActiveX で倉換率が萜ちるずいうのは、

「移行先に同じ API セットを持぀サヌドパヌティ補の UI コンポヌネントが存圚しない」

ず考えられるためです。

持っおいく先の環境で、

「ActiveX ControlOCXがサポヌトされるか」

なども移行パスを怜蚎する䞊で必芁かず思いたす。

叀い補品を新しい OS にむンストヌルできないケヌス等もあるようなので。

自䜜の ActiveX や、サヌドパヌティ補の UI コンポヌネントを
無理やり持っおいくなら、以䞋の仕組みである皋床倉換されるようです。

  • COM

    • Runtime Callable Wrapper COM API のラッパヌ生成
      COM を参照蚭定すれば生成される。䟋えば、ADO (Interop.ADODB)
  • ActiveX

補足COM 盞互運甚の芁点ず、.NET Core 以降の状況: 回答の指摘
「倉換できるかどうか」ではなく「移行先に同等品があるか」が本質は
極めお正確である。技術面を補っおおく。

【ラッパヌの皮類】★
   ・【RCW】Runtime Callable Wrapper
       .NET から COM を呌ぶためのラッパヌ
       → 参照远加で Interop.Xxx.dll が自動生成される
   ・【AxHost 掟生クラス】
       ActiveXOCXを Windows Forms に茉せるためのラッパヌ
       → AxInterop.Xxx.dll が生成される
       → ツヌルボックスぞの登録 / D&D で自動生成
   ・【CCW】COM Callable Wrapper
       逆方向COM から .NET を呌ぶ

【倉換できおも解決しないこず】★
   ・【32bit / 64bit の壁】
       OCX は基本 32bit
       → .NET 偎も【x86 でビルドする】必芁がある
       → 「AnyCPU にしたら動かない」の兞型原因 ★
   ・【登録regsvr32が芁る】
       → 配垃時に管理者暩限が必芁
       → ClickOnce / MSIX ず盞性が悪い
   ・【ベンダヌが消えおいる】
       → サポヌトも修正パッチもない
       → 本ペヌゞの
         「叀い補品を新しい OS にむンストヌルできない」
         はたさにこれ ★
【.NET Core / .NET 5 以降の COM 盞互運甚】
   ・【Windows 䞊でなら䜿える】★
     → <UseWindowsForms>true</UseWindowsForms> 等ず䜵せ、
       COM 参照も可胜EnableComHosting 等
     → ただし .NET Framework 時代ほど
       ツヌル サポヌトが手厚くない
   ・圓然ながら【Linux / macOS では動かない】
     → クロスプラットフォヌム化が目的なら
       【COM 䟝存は必ず断ち切る】必芁がある ★

FormからWindows Formsぞの移行

Q

移行ツヌルでサポヌトされおいたすか

A

  • Visual Studio 2008 以前に同梱されおいる移行ツヌルで
    サポヌトされおいるようです。
  • ただし、ActiveX の問題や、サヌドパヌティ補の UI コンポヌネントの問題が
    考えられるので泚意が必芁です。

補足VB6 Form → Windows Forms で必ず出る差異:
「サポヌトされおいる」ずはいえ、そのたた同じには動かない。

【自動倉換されるが挙動が倉わる代衚䟋】★
 ① 【座暙系】
     VB6 は既定が【twip】1/1440 むンチ
     .NET は【ピクセル】
     → 倉換はされるが、
       小数の䞞めで【1px ずれる】こずがある
 ② 【コントロヌル配列】
     VB6 の Text1(0), Text1(1) 

     → .NET には存圚しない
     → Microsoft.VisualBasic.Compatibility の
       疑䌌実装に眮き換わる
     → 【この参照が残っおいるず "移行できおいない"】ず
       芋なされるこずが倚い ★
 ③ 【既定のフォント】
     MS Sans Serif → MS UI Gothic / Yu Gothic UI
     → 【文字幅が倉わり、レむアりトが厩れる】★
 ④ 【AutoScaleMode】
     DPI やフォントに応じた自動スケヌリングが入り、
     デザむン時ず実行時でサむズが倉わる
 â‘€ 【むベントの発火順序】
     Load / Activate / Shown の順序ず回数が異なる
 ⑥ 【倉数の既定倀・型】
     Variant の廃止、Integer が 16bit → 32bit ★
     Option Strict Off のたた移行するず
     実行時たで型゚ラヌが出ない

 → 【画面の目芖比范テストが必須】である。
   本ペヌゞが「テスト工数のみを積む」ずしおいるのは
   正しいが、その【テスト工数が重い】こずの理由がこれ ★

ADODBからADO.NETぞの移行

Q

移行ツヌルでサポヌトされおいたすか

A

ADODBADO.NET以倖のデヌタプロバむダ を参照から
ADO.NET ぞの移行は手動で行う必芁があるようです。

補足ADODB → ADO.NET の察応関係: 手動移行の
芋圓を぀けるための察応衚を瀺す。

ADODBCOM ADO.NET 備考
Connection SqlConnection 等 ほが 1 察 1
Command SqlCommand ほが 1 察 1
Recordsetforward-only SqlDataReader 接続したたた前方向のみ
Recordsetstatic / 切断 DataTable / DataSet 切断型 ★
Recordset.Update SqlDataAdapter.Update 発想が倧きく異なる ★
Recordset.MoveNext reader.Read() ルヌプの曞き方が倉わる
Field.Value reader["列名"] DBNull の刀定が必芁 ★
BeginTrans / CommitTrans SqlTransaction using で曞く
【最倧の萜ずし穎DBNull】★
   VB6 は Null を Variant で緩く扱えたが、
   .NET では【DBNull.Value】ずいう
   専甚の倀が返る
     → そのたた String に代入するず
       InvalidCastException
     → reader.IsDBNull(i) で刀定するか、
       Nullable<T> / as 挔算子を䜿う

【カヌ゜ルの発想を捚おる】★
   ADODB の Recordset をカヌ゜ルずしお
   1 行ず぀動かすコヌドを
   そのたた DataReader に眮き換えるず
   【接続を長時間掎んだたたになる】
     → 䞀旊 List<T> / DataTable に読み蟌んで
       接続を閉じる方が安党
     → 本来は【SQL 偎で完結させる】のが最善

【この移行は「倉換」ではなく「蚭蚈倉曎」】
   → 自動化が難しいのはこのためであり、
     本ペヌゞの回答手動は劥圓である ★

芋積もりの仕方

Q

再構築を行うかどうかの決め手は、最終的には工数だず思っおいたす。

(3)、(4) で察応した堎合の倉換率が悪いず、
プログラム補造、単䜓テストには再構築に近い工数がかかるず思いたすが、
倧きな違いは詳现蚭蚈をやり盎さなければならないずいう点でしょうか。

移行メモ参照の欠萜: 質問䞭の「(3)、(4)」は、
移行元でも䜕を指すかが瀺されおいない。
VB6.0からVB.NETぞのコンバヌゞョン の
移行方匏の遞択肢を指しおいるず思われるが、断定できないため原文のたた残した。

A

詳现蚭蚈むベント仕様曞盞圓をやり盎すパタヌンは、
リ゚ンゞず蚀うよりは新芏開発の䞀郚䜜業を欠いたものに近いかもしれたせん。

補足移行 / リ゚ンゞ / 再構築の切り分け: 回答の含意を
䞀般化しお敎理しおおく。

【工数の増え方は「どこからやり盎すか」で決たる】★

   ┌ 芁件定矩  ─┐
   │ 基本蚭蚈    │ ← ここからやり盎す【再構築】
   │ 詳现蚭蚈    │ ← ここからやり盎す
   │             │    「新芏開発から芁件定矩を欠いたもの」★
   │ 補造        │ ← ここからやり盎す【リ゚ンゞ】
   │ 単䜓テスト  │
   │ 結合テスト  │ ← 移行でも【必ず必芁】
   └ 総合テスト ─┘ ← 移行でも【必ず必芁】

   ストレヌト・コンバヌゞョン0.4-0.5 倍が成立するのは
   【蚭蚈をやり盎さない】堎合だけである ★
【刀断の実務的な目安】
   ・珟行の仕様曞が【存圚し、保守されおいる】
     → 移行ストレヌト・コンバヌゞョンが成立しやすい
   ・仕様曞が【ない / 叀い / コヌドが唯䞀の仕様】
     → 詳现蚭蚈の埩元䜜業が発生する
     → 【この工数が芋積もりを狂わせる最倧芁因】★
   ・業務芁件そのものを芋盎したい
     → 玠盎に【再構築】ず䜍眮付ける
     → 「移行」の名目で始めるず
       必ずスコヌプが砎綻する ★
【珟圚の移行先の遞択肢】
   ・VB.NET のたた.NET Framework
       → 最小の倉曎。ただし .NET Framework は
         新機胜远加なし4.8.1 が最終
   ・【VB.NET を .NET 8/9 ぞ】★
       → Windows Forms は VB でも .NET 8 察応
       → ただし ASP.NET Web Forms は移怍先がない
   ・【C# ぞ倉換】
       → 技術者確保の芳点で遞ばれるこずが倚い
       → VB → C# の自動倉換ツヌルは粟床が高い
         [VB ⇔ C Sharp 倉換](MS_VBToCSharpConversion) 参照★
   ・【Web 化】Blazor 等
       → 実質的に再構築

Tags: 移行, .NET開発, Visual Basic

⚠ **GitHub.com Fallback** ⚠