VB6アプリはいつまで動くのか ── ランタイムのサポート状況と現実的な.NET移行の進め方

· 更新日: · · VB6, .NET, C#, レガシー技術, 既存資産活用, 移行, モダナイゼーション, 32bit, Windows開発, 判断表, 技術相談

更新履歴(5件・最終更新 2026年08月02日)

この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。

記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
COM相互運用の最小コード例(.NETをCOM公開してVB6から呼ぶ / VB6製ActiveX DLLを.NETから呼ぶ)、プロジェクトファイルから参照を一括抽出する手順、新旧の境界をどこに置くかの構成図、自動変換ツールの選定基準、見積もりの立て方と着手1週間分のチェックリストを追加しました。
WOW64、OCX、ActiveX DLL、COM相互運用、ストラングラーパターンなど、本文で説明なしに使っていた用語の表を冒頭に追加しました。
本文中の関連記事へのリンクの文言が、リンク先の現在のタイトルと食い違っていたのを、実際のタイトルに揃えました。本文の内容は変えていません。
初版公開
この記事を引用する(DOI: 10.5281/zenodo.21590001)

この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。

小村 豪(2026)「VB6アプリはいつまで動くのか ── ランタイムのサポート状況と現実的な.NET移行の進め方」合同会社小村ソフト. https://doi.org/10.5281/zenodo.21590001 https://staging.comcomponent.com/blog/vb6-to-dotnet-migration-practical-guide/

DOI(最新版)
10.5281/zenodo.21590001
DOI(この版)
10.5281/zenodo.21732982

「このVB6のシステム、いつまで動くんですか」──既存システムの相談で、最も多い質問の一つです。

答えは意外と明確で、マイクロソフトが公式にサポートポリシーを出しています。ただしその内容は、「ランタイムは当分動く。しかし開発の後ろ盾はもうない」という非対称なものです。この非対称さを正しく理解しないと、「まだ動くから大丈夫」と「今すぐ全部作り直すべき」という両極端な結論に振れてしまいます。

当ブログでは「VB6 / Access業務アプリの延命と移行 ── 残す・包む・置き換えるの判断表」で、VB6資産をどう扱うかを決めるための判断を整理しました。この記事はその続きとして、「置き換える(移行する)」と決めた後、あるいは決めるために、VB6から.NETへの移行を実際にどう進めるかに踏み込みます。

この記事で使う用語

VB6世代を直接は知らない読者もいるはずなので、先に用語を整理しておきます。

用語 意味
WOW64 Windows 32-bit On Windows 64-bit。64bit Windows上で32bitアプリをそのまま動かすためのx86エミュレーターです。OSに標準で入っており、有効化の操作は不要です。重要な制約として、32bitプロセスは実行のために64bit DLLを読み込めず、その逆もできません1
OCX OLE Control Extension。ActiveXコントロール(COMベースの画面部品)のファイル形式・拡張子。VB6の画面はグリッドやカレンダーなどのOCXに強く依存していることが多い
ActiveX DLL VB6で作れる、画面を持たないCOMコンポーネント。業務ロジックを部品化するのに使われた
COM相互運用(COM interop) .NETとCOMコンポーネントを相互に呼び出すための仕組み。.NETの型をCOMとして公開する方向と、COMの部品を.NETから使う方向の両方がある(第7.2章)
ストラングラー(Strangler Fig) 段階移行の設計パターン。既存システムの前に窓口(ファサード)を置き、機能を1つずつ新システムへ移し替えていき、最終的に旧システムを役目のない状態にして停止させます。名前は宿主の木に巻き付いて成長し最後には覆い尽くす「絞め殺しイチジク」に由来します2
Declare VB6からWin32 APIを直接呼び出すための宣言。移行時は「.NETの標準機能で置き換えられるか」の仕分け対象になる(第5章)
ADO / DAO / RDO VB6時代のデータアクセス技術。.NET側の対応はADO.NET以降で、考え方が異なるため単純な置換はできない(第6章)

1. まず結論

  • VB6のIDE(開発環境)は2008年4月8日にサポートが終了しています。VB6アプリを作成・保守するサポートされた手段はもう存在せず、マイクロソフトはモダンな技術への置き換えを強く推奨しています。3
  • 一方、VB6ランタイムは「同梱されるWindowsのサポート期間中」はサポート対象です。対象OSの一覧にはWindows 11、Windows 10、Windows Server 2025などが含まれており、既存アプリは「そのまま動く(It Just Works)」ことが目標とされています。4 つまり「いつまで動くのか」への答えは、実行だけならWindowsのサポートが続く限りです。
  • ただしそのサポート範囲は、既存アプリに対する深刻なリグレッションと重大なセキュリティ問題への対応に限定されています。また、ランタイムは32bit専用で、64bit Windows上ではWOW64環境でのみサポートされます。4
  • 本当のリスクは「動かなくなること」より、直せなくなることです。IDEの入手・維持が年々難しくなり、参照しているOCXのベンダーサポートが切れ、書ける人が退職していく。この3つは、Windowsのサポート期間とは無関係に進行します。
  • 移行の進め方は、全面リライト・自動変換・段階移行の3系統があります。最初に決めるのは方式ではなく棚卸しで、画面数・外部連携・OCX・API宣言の量を把握してから方式を選びます。
  • 移行先の言語は、新規に書く部分はC#を推奨します。VB.NET(Visual Basic)は安定路線が公式に明言されており、新しい構文・新しいワークロードへの拡張は行われません。5

この記事の知識マップ

VB6アプリの実行基盤であるVB6ランタイムはWindowsのサポート期間中は動作対象である一方、開発環境のVB6 IDEは2008年に終了しており、直せる体制が失われることこそが本当のリスクになります。VB6ランタイムは32bit専用でWOW64環境でのみ動作するため、64bit前提の.NETコンポーネントとは同一プロセス内で単純には両立しません。移行は全面リライト・自動変換ツール・段階移行(ストラングラーパターン)の3方式に整理され、どの方式でも.vbpファイルからのOCX・COM参照の棚卸しと、COM相互運用によるVB6と.NETの共存が土台になります。移行後に新規で書く言語はC#が推奨され、VB.NETは既存シナリオの維持に向く安定路線と位置づけられます。

VB6から.NETへの移行の知識マップVB6のIDEとランタイムのサポート状況の違い、WOW64による32bit制約、全面リライト・自動変換・段階移行(ストラングラーパターン)という移行方式の選択肢、COM相互運用による新旧共存、移行後の言語としてC#とVB.NETのどちらを選ぶかの関係を示す図前提とする前提とする前提とする両立しないの後継利用する実装を担う利用する利用する推奨される対応前提とするで構成できる前提とする前提とする前提とする推奨される対応推奨される対応で確認できる利用する利用するの後継の後継Visual Basic 6.0(VB6).NET(Core以降)VB6ランタイムVB6 IDE(Visual Studio 6.0)WOW64OCXActiveXVB6自動変換ツールVisual Basic .NET(VB.NET)ストラングラーパターン(Strangler Fig)COM(Component Object Model)bitness一致要件regsvr32COM(コンポーネントオブジェクトモデル)C#.vbpファイル(VB6プロジェクトファイル)Windows Forms.NET Framework

図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全22件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle

2. 「いつまで動くのか」の正確な答え ── サポートポリシーの読み方

マイクロソフトのVB6サポートポリシーは、VB6を3つの構成要素に分けて説明しています。4

構成要素 内容 サポート状況
VB6 IDE 開発環境(Visual Studio 6.0) 2008年4月8日で終了
VB6ランタイム msvbvm60.dll などOSに同梱される実行基盤 同梱されるWindowsのサポート期間中はサポート
ランタイム拡張ファイル 主要なOCXコントロール類(アプリと共に再配布) 同上(アプリ側で配布が必要)

対象OSの表では、Windows 11・Windows 10、Windows Server 2012〜2025で「ランタイム: サポート」「IDE: サポート外」と明記されています。4

読み方のポイントは3つあります。

第一に、ランタイムのサポートはWindowsのライフサイクルに完全に従属します。「VB6ランタイムのサポート期限」という独立した日付は存在せず、使っているWindowsのサポート終了がそのまま期限です。

第二に、サポートの中身は「動き続けること」の保証に近いものです。対応されるのは深刻なリグレッション(OS更新で既存アプリが壊れた場合)と重大なセキュリティ問題だけで、個別の調査や機能改善は含まれません。4

第三に、VB6アプリは今後も32bitプロセスとしてしか生きられません。ランタイムは32bit専用で、64bit OSではWOW64エミュレーション環境でのみサポートされます。4 64bit専用のDLLやSDKと連携する必要が出た時点で、単一プロセスでは完結しなくなります。この壁の越え方は「32bitアプリから64bit DLLを呼ぶCOMブリッジ実例」で扱っています。

3. 「動く」と「維持できる」は別問題

サポートポリシーだけを見ると「急ぐ必要はない」ように読めます。しかし実務では、実行環境より先に開発と保守の環境が崩れていきます。

  • IDEが用意できない。VB6 IDEは現行OSでのサポート対象外で、正式な入手手段・インストール手段の維持が年々難しくなっています。「直せる環境が社内に1台しかない」状態は珍しくありません。
  • サードパーティOCXのベンダーサポートが切れている。サポートポリシーもサードパーティ製コントロールはベンダー側の責任範囲と明記しています。4 グリッドや帳票のOCXがすでに入手不能というケースは多く、この判断は「ActiveX / OCX を今どう扱うか」で整理した内容がそのまま適用できます。
  • 書ける人がいなくなる。言語仕様の問題ではなく人の問題です。新規にVB6を学ぶ技術者はほぼ供給されないため、保守できる人数は単調に減ります。
  • 周辺要件が32bitの壁に当たる。新しい機器SDK、認証ライブラリ、クラウド連携などが64bit前提・.NET前提になり、VB6プロセスに取り込めない要求が増えていきます。

つまり「いつまで動くか」は問題の半分でしかありません。もう半分は「次に修正が必要になったとき、直せる体制が残っているか」です。移行の計画は、障害が起きてからではなく、直せる人と環境が残っているうちに立てる必要があります。

4. 移行方式の判断表

「置き換える」と決めた場合でも、進め方には幅があります。主な方式を整理します。

方式 概要 向いているケース 主なリスク
全面リライト 仕様を整理し直し、.NETで新規に作る 画面数が少ない/業務フロー自体を見直したい/仕様が説明できる 隠れた業務ルールの漏れ、並行開発期間の長期化
自動変換ツール 変換ツールでVB6コードを.NETコードへ機械変換し、人が仕上げる コード量が多く、ロジックをそのまま保ちたい/画面構成を変えない 変換後コードの品質・可読性、結局残る手作業、ツール費用
段階移行(ストラングラー) 機能単位に切り出し、新旧を共存させながら順に置き換える 業務を止められない/画面・機能が多い/リスクを分散したい 新旧共存期間の複雑さ、境界(連携部)の設計力が要る
現状維持+文書化 移行せず、環境固定・バックアップ・文書化で延命 変更要求がほぼない/端末とOSを固定できる 前章のリスクが解消されない(先送り)

どれを選ぶかはコード行数だけでは決まりません。マイクロソフト自身も、移行にあたって公式ガイドとともにアップグレード・移行パートナー(移行ツールベンダーを含む)の利用を案内しており3、機械変換という選択肢は現実に存在します。ただし、どの方式でも共通して必要になるのが次章の棚卸しです。

4.1 「変換ツール」とは具体的に何か

「自動変換ツール」と一括りに書きましたが、マイクロソフトはVB6のパートナー製品を実名で案内するページを公開しています。「Visual Basic 6.0からVisual Basic .NETへのより完全な移行を支援する、パートナーによる無償・有償のツールとソリューション」という位置付けで、次の3つが挙げられています。6

ツール 公式ページでの説明
Mobilize.Net Visual Basic Upgrade Companion(VBUC) VB6から.NETへの移行における業界をリードするツールで、C#とVB.NETへ数百万行の移行実績があり、サードパーティ依存から解放された形にできるとされています。無償で使える版も用意されています
Great Migrations Studio(gmStudio) VB6 / ASP / COM から.NETへのアップグレード手順を、計画・カスタマイズ・改善・検証・追跡まで含めて作り込むための再エンジニアリング環境と説明されています
VB Migration Partner VB6アプリケーションをVB.NETまたはC#へ移植するツール。VB6の機能とコントロールをほぼ網羅し、生成コードをカスタマイズしながら元のVB6プロジェクトと同期を保つ「Convert-Test-Fix」の進め方が特徴とされています

上記はマイクロソフトのページに載っている説明の要約であり、当社が推奨・保証するものではありません。選定は必ず自社のコードで試してから行ってください。見るべき観点は次のとおりです。

選定基準 具体的に確認すること
出力言語 C#が出せるか、VB.NETのみか。第8章の言語方針と食い違わないか
出力先の.NET 現行の.NET(.NET 8など)に出せるか、.NET Framework止まりか
ランタイム依存 変換後のコードがツールベンダー独自のサポートライブラリを参照しないか。参照する場合、そのライブラリの保守が今後も続くか(新しいベンダーロックインを作っていないか)
OCXの扱い 使用中のOCXに対応する代替コントロールを持っているか、手作業になるか
変換率の測り方 「変換率95%」の分母が行数なのか構文要素なのか。残り5%が最も難しい部分に偏るのが普通なので、率よりも「何が残るか」の一覧を出させる
試用の可否 自社の実コードで試せるか。無償版・評価版の行数上限はいくつか
費用の単位 行数課金か、プロジェクト単位か、コンサルティング込みか
反復できるか 変換を一度きりで終わらせるのか、旧VB6側の修正を取り込みながら何度も変換をやり直せるのか

最後の「反復できるか」は見落とされやすい観点です。移行期間中もVB6側には障害対応が入ります。一度きりの変換しかできないツールだと、その修正を新旧の両方に手で入れ続けることになります。

なお「現状維持+文書化」を選ぶ場合の実務(実行環境の固定、バックアップ、リスクの引き受け方)は、前回のVB6 / Access記事で扱っています。

5. 移行前の棚卸し ── コードより先に調べること

見積もりと方式選定の精度は、棚卸しの精度で決まります。最低限、次を一覧化します。

  1. 画面と帳票の一覧 ── フォーム数、実際に使われている画面(使われていない画面の移行は無駄になります)、帳票の種類と出力先(プリンター直接印字か、Excel経由か)
  2. 外部連携の一覧 ── データベース(ADO/DAO/RDOのどれで、接続先は何か)、ファイル入出力、シリアル・ソケット通信、他システム呼び出し
  3. OCX / ActiveX / COM参照の一覧 ── プロジェクトファイル(.vbp)の参照から機械的に抽出できます。各コンポーネントの入手可否・代替有無が、方式選定に直結します
  4. Win32 API宣言(Declare文)の一覧 ── APIの用途(印刷、INI読み書き、ウィンドウ操作など)ごとに、.NET側の標準機能で置き換えられるかを分類します
  5. コードにしかない業務ルール ── 端数処理、日付の締め、取引先ごとの例外など。「なぜこう書かれているか誰も知らない」箇所こそ、移行後の不具合の温床です
  6. テスト手段の有無 ── 移行の正しさを何と比較して確認するか。多くの場合、旧システムの出力(帳票、CSV、DB内容)との突合が最も実用的な検証手段になります

この棚卸しは、全面リライトを選ばない場合でも無駄になりません。むしろ棚卸しの結果、「全面リライトだと思っていたが、実は core のロジックはDB側に寄せられる」「この10画面だけ先に移せば64bitの壁は越えられる」といった段階移行の切り口が見つかるのが普通です。

5.1 「機械的に抽出できます」の中身 ── .vbp から参照部品を洗い出す

3番目の項目に「.vbpの参照から機械的に抽出できます」と書きました。その方法を具体的に示します。

プロジェクトファイル(.vbp)はASCIIのテキストファイルです。マイクロソフトの公式ドキュメントにも中身の例が載っており、参照設定は次の形の1行として記録されます。7

Type=Exe
Form=B_Form.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\WINDOWS\SYSTEM\STDOLE2.TLB#OLE Automation
Form=A_Form.frm
Module=CModule; C_Module.bas
Class=DClass; D_Class.cls
Startup="BForm"
Name="Project1"

Reference= の値は # 区切りで、GUID(タイプライブラリのID)→ バージョン → ロケール → ファイルパス → 説明(ライブラリ名) の順に並びます。上の例では OLE Automation が説明にあたります。画面に貼り付けたActiveXコントロール(OCX)は Object= の行として記録されるので、この2種類の行を集めれば「このプロジェクトが依存している外部部品の一覧」になります。

プロジェクトが数十個あるシステムでは、次のようなスクリプトで一括して吸い出します。

# フォルダー配下の全 .vbp から、参照している部品の行を抜き出してCSVにする
# 動作環境: Windows PowerShell 5.1
Get-ChildItem -Path . -Filter *.vbp -Recurse | ForEach-Object {
    $project = $_.FullName
    Get-Content -LiteralPath $project | Where-Object {
        $_ -like 'Reference=*' -or $_ -like 'Object=*'
    } | ForEach-Object {
        $kind, $value = $_ -split '=', 2
        [pscustomobject]@{
            Project = $project
            # Reference = 参照設定したタイプライブラリ / Object = 画面に貼ったActiveXコントロール
            Kind    = $kind
            Entry   = $value
        }
    }
} | Sort-Object Kind, Entry | Export-Csv .\vb6-components.csv -NoTypeInformation -Encoding UTF8

出てきたCSVを重複排除して並べれば、「このシステムは結局どのCOM部品に依存しているか」が半日で一覧になります。あとは1件ずつ、入手可能か・ベンダーサポートがあるか・.NET側の代替があるかを埋めていくだけです。この表がそのまま、第4章の方式選定と見積もりの土台になります。

同じ発想で、Declare 文の一覧も .bas / .frm / .cls を横断して Declare を含む行を拾えば作れます。棚卸しで手作業に頼るべきなのは「コードにしかない業務ルール」だけで、それ以外はほぼ機械化できます。

5.2 工数と期間の見積もり方

「画面1枚あたり何日」という数字は、画面の複雑さ、OCXの有無、業務ロジックの密度、求められるテストの厳しさで簡単に一桁変わります。他社の事例値をそのまま持ち込んでも当たりません。代わりに、自社の数値を作る手順を置きます。

  1. 数える。棚卸しで、画面数・帳票数・外部連携数・OCXの種類数・Declare 文の数・テーブル数を確定させます。
  2. 難易度で仕分ける。画面を3段階程度に分けます(単純な一覧・参照画面/入力と検証がある画面/グリッドや帳票プレビューを含む画面)。
  3. 各段階から1枚ずつ、実際に移行してみる(パイロット)。設計・実装・単体テスト・旧システムとの出力突合までを含めた実時間を計測します。ここが見積もりの単価になります。
  4. 掛けて積む。3で得た単価を、2の枚数に掛けて積み上げます。
  5. 別枠を足す。共通部分(認証、ログ、印刷基盤、配布、環境構築)と、「コードにしかない業務ルール」の解読時間は画面数に比例しません。この別枠が抜けている見積もりは必ず不足します。
  6. 合わなければ方式に戻る。パイロットの実測が想定より大きく悪ければ、それは見積もりの誤差ではなく方式選定の誤りのサインです。第4章に戻って、全面リライト・自動変換・段階移行を選び直します。

要点は、見積もりの根拠を他社の事例値ではなく自社のパイロット実測に置くことです。パイロットは費用ではなく、見積もり精度を買う投資だと考えてください。

6. VB6と.NETの主な非互換ポイント

VB6とVB.NET/C#は、名前の印象より遠い言語です。機械変換でも人手リライトでも、次の差異は必ず設計判断が要ります。

領域 VB6 .NET 実務上の注意
エラー処理 On Error GoTo / Resume 構造化例外(Try...Catch) 単純置換不可。「エラーを握りつぶして続行」していた箇所の仕様確認が必要
VariantIntegerは16bit 静的型付け中心、Integerは32bit 暗黙変換に依存したコードの洗い出し。数値型のサイズ差は互換バグの定番
既定プロパティ Text1 = "abc" のような省略記法 廃止(明示が必要) 変換ツールの誤解釈ポイント。オブジェクト代入と値代入の区別が曖昧なコードに注意
データアクセス ADO / DAO / RDO ADO.NET以降 接続・トランザクション・カーソルの考え方が別物。データ層は「変換」ではなく「再設計」が前提
画面 VB6フォーム+OCX WinForms / WPF コントロールは1対1対応しない。グリッド等のOCXは代替選定が必要
印刷・描画 Printerオブジェクト、フォーム直接描画 GDI+ / 印刷API 帳票は移行工数が読みにくい領域。Excel帳票への寄せ替えも選択肢
起動・配布 EXE+ランタイム+OCX登録 自己完結型配布も可能 レジストリ登録(regsvr32)前提の運用から脱却できるのは移行のメリット

ここで重要なのは、非互換の多さに圧倒されて全面リライト一択と考えないことです。逆に、この表の左側(VB6)の資産が今も正しく動いているという事実自体が、移行時の最良の仕様書になります。旧システムを「動く仕様書」として並行稼働させ、出力を突合しながら進めるのが、実務的には最も確実です。

7. 段階移行の実務パターン

業務を止めずに移行する場合、新旧の共存構成が要になります。代表的なパターンを3つ挙げます。違いは一言でいえば「新旧の境界をどこに置くか」です。

7.3 プロセスを分ける ── 境界はIPC、別プロセス名前付きパイプ / ファイル / localhost通信VB6アプリ ── 32bitプロセス.NET アプリ ── 64bitでもよい7.2 COM相互運用でつなぐ ── 境界はCOMインターフェイス、同一プロセスCOMインターフェイスVB6アプリ ── 32bitプロセス.NET の部品 ── 32bitでビルドする必要がある7.1 データ層を先に移す ── 境界はデータベース移行後のデータベース ── SQL Server などVB6アプリ ── 接続先だけ切り替える.NET の新画面 ── 順に増やしていく

図1: 段階移行の3パターン ── 新旧の境界をどこに置くか

7.1 データ層を先に移す

VB6アプリのデータをAccessファイルや独自形式からSQL Serverなどへ先に移し、VB6側は接続先だけ切り替えて動かし続ける構成です。データが先に近代化されていれば、新画面(.NET側)は同じDBを見て段階的に増やせます。Access絡みの具体的な手順は前回記事のアップサイズの章を参照してください。

7.2 新機能・新画面を.NETで作り、COM相互運用でつなぐ

既存のVB6画面はそのままに、新しい機能を.NETで作って共存させる構成です。方向は2つあります。

  • .NET側の部品をVB6から呼ぶ: .NETのクラスをCOMとして公開すれば、VB6からは普通のCOMコンポーネントとして参照できます。.NET 8以降でも型付きで公開する方法を「.NET 8 DLLをVBAから型付きで使う方法 - COM公開とdscom TLB」で解説しており、呼び出し側がVB6でも考え方は同じです。
  • VB6側の資産を.NETから呼ぶ: VB6で作られたActiveX DLLは、.NETからCOM相互運用で参照できます。ロジックを塊のまま生かし、画面だけ先に.NET化する場合に使います。ただし32bitの制約は残るため、恒久策ではなく移行期間中の橋と割り切ります。

橋渡しの実装は、最小構成なら数行です。まず.NET側の部品をVB6から呼ぶ方向。公開したいインターフェイスとクラスに属性を付けます。8

// .NET側(C# / .NET 8)── VB6から呼べるようにCOM公開する
using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]   // インターフェイスのIID。必ず自分で新規生成する
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITaxCalculator
{
    decimal CalcTax(decimal amount);
}

[ComVisible(true)]
[Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]   // クラスのCLSID。これも新規生成する
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Komura.TaxCalculator")]
public class TaxCalculator : ITaxCalculator
{
    public decimal CalcTax(decimal amount) => Math.Floor(amount * 0.1m);
}

csprojにCOMホストの生成を指示してビルドし、生成された .comhost.dll を管理者権限のコマンドプロンプトから登録します。8

<PropertyGroup>
  <EnableComHosting>true</EnableComHosting>
</PropertyGroup>
regsvr32 TaxLib.comhost.dll

呼ぶ側のVB6は、いつものCOMオブジェクトと同じです。

' VB6側 ── ProgIdを使った遅延バインド呼び出し
Dim calc As Object
Set calc = CreateObject("Komura.TaxCalculator")
MsgBox calc.CalcTax(12345)
Set calc = Nothing

ここで必ずつまずく落とし穴が2つあります。どちらも公式ドキュメントに書かれています。8

  • 既定では64bitクライアントからしか使えません。.NET Framework時代と違い、.NET Core / .NET 5以降では「Any CPU」でビルドしても、付随する *.comhost.dll既定で64bitになります。VB6は32bitプロセスなので、このままでは読み込めません(WOW64の制約そのものです1)。32bit版の comhost.dll が出るようにビルド構成を合わせてください。
  • 自己完結型(self-contained)配布のCOMコンポーネントはサポートされません。フレームワーク依存の配布だけがサポート対象です。配布方式を先に決めてから設計してください。

もう一つ、VB6の資産を.NETから呼ぶ方向は、VB6製ActiveX DLLをCOM参照として追加するだけです。

// .NET側 ── VB6製ActiveX DLLをCOM参照して呼ぶ
// 事前準備: プロジェクトに「COM参照」を追加し、32bit(x86)ビルドにしておく
var legacy = new LegacyBiz.OrderCalc();      // VB6で書かれたクラス
decimal total = legacy.CalcTotal(orderId);   // 業務ロジックはVB6側のまま
Marshal.ReleaseComObject(legacy);            // COMオブジェクトは明示的に解放する

こちらも呼び出す.NET側を32bit(x86)でビルドする必要があります。VB6のActiveX DLLは32bitのDLLであり、64bitプロセスは32bit DLLを実行のために読み込めないためです。1 「64bitの新機能を入れたいのにVB6のロジックも呼びたい」という要求は、この時点で同一プロセスでは成立しません。次の7.3の出番になります。

7.3 プロセスを分けて連携する

COM相互運用で同一プロセスに同居させると、ビット数(32bit/64bit)と障害の巻き込みが制約になります。64bitの新機能が必要な場合や、新旧の障害を分離したい場合は、別プロセスに分けてファイル・名前付きパイプ・localhost通信などで連携します。プロセス間連携の選択肢は「WindowsのIPC判断表」に、32bit→64bitブリッジの実例は「COMブリッジ実例」にまとめています。

どのパターンでも共通する原則は、「新旧の境界を1か所に集約し、境界を跨ぐデータの形式を固定する」ことです。境界が画面ごと・機能ごとにバラバラに増えると、共存期間のコストが移行の効果を食い潰します。

8. 移行先の言語 ── C#かVB.NETか

「VB6からならVB.NETが自然」と思われがちですが、現在のマイクロソフトの言語戦略を踏まえると単純ではありません。

公式の言語戦略では、Visual Basic(VB.NET)は「安定した設計を保つ、分かりやすく親しみやすい言語」と位置づけられ、新機能は原則として消費(consumption-only)のみで新しい構文は追加しない、新しいワークロードへの拡張は行わない方針が明示されています。一方で、Windows Formsやライブラリといった中核シナリオへの投資と、Visual Studio上の開発体験の改善は継続するとされています。5

これを移行の観点で読むと、次のようになります。

  • VB.NETを選んでも、既存シナリオ(WinFormsの業務アプリ)は当面問題なく成立します。VB6経験者が多く、文法の近さが学習コストを下げるチームでは合理的な選択です。
  • ただし、これから新規に書く資産の土台としてはC#を推奨します。言語とエコシステムの進化が続いており、サンプル・ライブラリ・人材の供給もC#に集中しています。「VB6の保守要員がいない」問題を、10年後に「VB.NETの保守要員がいない」問題として繰り返さないための選択です。
  • 折衷案として、変換ツールの出力はVB.NETで受け、新規開発はC#で書く構成も取れます。.NETでは両言語のアセンブリは相互に参照できるため、言語を混在させること自体は障害になりません。

画面フレームワークの選択(WinForms / WPF / WinUI)は「WinForms・WPF・WinUIの判断表」を、.NET Frameworkではなく現行.NETへ直接移行する際の確認事項は「.NET Framework→.NET移行前チェックリスト」を参照してください。VB6からの移行でわざわざ.NET Framework 4.8を新規採用する理由は、参照ライブラリの制約がない限りありません。

9. まとめ

  • 「VB6はいつまで動くのか」への答えは、ランタイムはWindowsのサポート期間中は動作対象(Windows 11も対象)です。ただしIDEは2008年にサポート終了しており、作り直す・直す手段の公式な後ろ盾はすでにない、という非対称な状態です。43
  • 本当の期限はOSではなく、直せる環境と人が残っているかで決まります。移行計画は障害発生後ではなく、旧システムが「動く仕様書」として使えるうちに立てます。
  • 進め方は全面リライト・自動変換・段階移行の3系統。方式選定の前に、画面・外部連携・OCX・API宣言・コードにしかない業務ルールの棚卸しを行います。
  • 業務を止めない移行では、データ層先行・COM相互運用・プロセス分離のいずれかで新旧を共存させ、境界を1か所に集約します。
  • 新規に書く部分の言語はC#を推奨します。VB.NETは安定路線が公式方針であり5、長期保守の土台としてはC#の方が有利です。

9.1 次の一歩 ── 最初の1週間でやること

「移行を検討する」で止まらないための、着手できる粒度のチェックリストです。コードは1行も書きません。

  • ソースコード一式の所在を確認する。最新の本番実行ファイルと突き合わせて、そのソースが本当に現行版かを確かめる(第3章のとおり、ここが食い違っていると以降が全部無駄になります)
  • VB6 IDEが動く端末を確認する。何台あるか、そのOSは何か、壊れたら再構築できるか
  • .vbp から参照部品を一覧化する。第5章のスクリプトをそのまま流し、CSVにする
  • 一覧の各部品に「入手可否/ベンダーサポート/.NET側の代替」の3列を足して埋める。埋まらないセルが、移行の難所です
  • 画面と帳票を数える。そのうえで現場に「実際に使っている画面」を確認する。使われていない画面を移行しないだけで工数は大きく変わります
  • Declare 文を横断で抽出する。用途別に分類し、.NETの標準機能で置き換えられるかを仕分ける
  • 検証の当てを決める。移行後の正しさを何と比べて確認するか(帳票、CSV、DBの内容)を1つ決めておく
  • 32bitで困っている要件があるかを確認する。あるなら、その1点が方式選定の最優先条件になります

ここまでで、第4章の方式選定と、第5章のパイロットに進むための材料は揃います。

関連記事

関連する相談領域

合同会社小村ソフトでは、VB6を含む既存資産の棚卸しと移行方針の整理、COMブリッジ・プロセス分離による新旧共存構成の設計・実装、.NETへの段階的なリプレイスを扱っています。

参考リンク

  1. Microsoft Learn, Running 32-bit Applications. WOW64が64bit Windows上で32bitアプリケーションを動作させるx86エミュレーターでありOSに標準搭載されていること、システムが32bitアプリと64bitアプリを分離しファイルとレジストリの衝突を防ぐこと、32/64の境界をまたぐCOMなどの相互運用が提供されること、ただし32bitプロセスは実行のために64bit DLLを読み込めず64bitプロセスも32bit DLLを読み込めないことについて。  2 3

  2. Microsoft Learn, Strangler Fig pattern (Azure Architecture Center). レガシーシステムの機能を少しずつ新しいアプリケーション・サービスに置き換えて段階的に移行するパターンであること、クライアントとの間にファサード(プロキシ)を置いて要求を新旧へ振り分けること、移行が進むにつれ振り分け先を新システムへ移していき、最終的に旧システムを停止してファサードも取り除くことについて。 

  3. Microsoft Learn, Visual Basic 6.0 Support Announcement. VB6 IDE / Visual Studio 6.0 IDEが2008年4月8日でサポート終了したこと、VB6アプリを作成・保守するサポートされた手段が存在しないためモダンな技術への置き換えを強く推奨していること、移行にあたりアップグレードガイドと移行パートナーが案内されていることについて。  2 3

  4. Microsoft Learn, Support Statement for Visual Basic 6.0 on Windows. VB6ランタイムは同梱されるWindowsバージョンのサポート期間中はサポート対象であること、Windows 11・Windows 10・Windows Server 2025等が対象OSに含まれること、サポート範囲は深刻なリグレッションと重大なセキュリティ問題に限られること、ランタイムは32bit専用で64bit OSではWOW環境でのみサポートされること、サードパーティ製コントロールはベンダーの責任範囲であることについて。  2 3 4 5 6 7 8

  5. Microsoft Learn, Annotated Visual Basic language strategy および Microsoft .NET language strategy. Visual Basicは安定した設計を保ち、新機能は消費(consumption-only)中心で新しい構文の追加を避けること、新しいワークロードへは拡張しないこと、Windows Formsやライブラリなど中核シナリオとVisual Studio体験への投資は継続することについて。  2 3

  6. Microsoft Learn, Visual Basic 6.0 partner offers. Visual Basic 6.0からVisual Basic .NETへのより完全な移行を支援するパートナー製の無償・有償ツールとして、Mobilize.NetのVisual Basic Upgrade Companion(VBUC)、Great Migrations Studio(gmStudio)、VB Migration Partnerの3つが紹介されていることについて。 

  7. Microsoft Learn, Project File (.vbp) Format. Visual Basicがプロジェクトファイル(.vbp)を常にASCII形式で保存すること、プロジェクトのフォーム・モジュール・参照・コンパイル設定などが行単位で記録されること、Reference= 行の実例(GUID・バージョン・ロケール・ファイルパス・説明が # 区切りで並ぶ)について。 

  8. Microsoft Learn, Exposing .NET Core components to COM. インターフェイスとクラスに [ComVisible(true)][Guid] を付与すること(.NET Frameworkと異なりCOMからアクティブ化するクラスのCLSID指定が必須であること)、csprojに <EnableComHosting>true</EnableComHosting> を追加すると プロジェクト名.comhost.dll が出力され regsvr32 で登録できること、.NET Core / .NET 5以降ではアセンブリからのTLB自動生成がサポートされずIDLを書くかコミュニティ製の dscom を使う必要があること、既定では「Any CPU」でも付随する *.comhost.dll が64bitになるため64bitクライアントからしか利用できないこと、COMコンポーネントの自己完結型(self-contained)配布はサポートされずフレームワーク依存の配布のみがサポートされることについて。  2 3

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

この記事は次のサービスページにつながります。近い入口からご覧ください。

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

VB6アプリはWindows 11でも動きますか?
動作対象です。マイクロソフトのサポートポリシーでは、VB6ランタイム(msvbvm60.dllなど)は同梱されるWindowsバージョンのサポート期間中はサポート対象とされており、対象OSの一覧にはWindows 11・Windows 10やWindows Server 2025などが含まれています。ただしサポートの範囲は、既存アプリに対する深刻なリグレッションと重大なセキュリティ問題への対応に限られます。またVB6ランタイムは32bit専用で、64bit Windows上ではWOW64という32bit互換環境の中でのみサポートされます。
VB6から.NETへの移行は自動変換ツールだけで完了できますか?
完了できないと考えるべきです。変換ツールは画面定義や単純なロジックの書き換えを省力化できますが、On Errorによるエラー処理、Variant型や既定プロパティに依存したコード、ActiveXコントロール、Win32 API宣言などは人手での設計判断と修正が必要です。ツールの出力をそのまま本番に使うのではなく、「変換後に人が仕上げる工数」を含めて全体を見積もり、変換結果の検証方法(並行稼働や出力比較)を先に決めておくことが重要です。
移行先はVB.NETとC#のどちらを選ぶべきですか?
新規に書く部分はC#を推奨します。マイクロソフトの言語戦略では、Visual Basic(VB.NET)は安定した設計を保つ言語と位置づけられ、新しい構文の追加や新しいワークロードへの拡張は行わない方針が明示されています。既存シナリオ(Windows Formsなど)への投資は続くためVB.NETが使えなくなるわけではありませんが、これから10年保守するコードの土台としては、言語・エコシステムともに進化が続くC#の方が人材確保の面でも有利です。VB6経験者が多いチームでは、文法が近いVB.NETを経由する判断もあり得ます。
全面リライトの前に、まず何をすべきですか?
コードを書き始める前に棚卸しをすべきです。具体的には、画面・帳票の一覧、外部連携(DB、ファイル、シリアル通信、他システム)の一覧、参照しているOCX/ActiveXコントロールとCOMコンポーネントの一覧、Win32 API宣言(Declare文)の一覧、そして「仕様書はコードしかない」業務ルールの洗い出しです。この棚卸しの結果によって、全面リライトではなく、一部だけを切り出す段階移行や、データ層を先に移す構成の方が現実的だと分かることが多くあります。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る