「32-bit のネイティブ DLL に依存しているため、Visual Studio 2022 でもテストホストを x86(32 ビット)で起動したい」。そんな現場の悩みに、最短で確実に効く解をまとめました。ポイントは “vstest.console.exe 本体が 64 ビットでも問題ない”。/Platform や .runsettings、.NET CLI の --arch を正しく使えば、testhost を x86 で起動できます。以下で、目的別の手順、仕組み、つまずきやすい落とし穴、CI や IDE の具体設定まで網羅します。
結論(最短の実践手順)
| 目的 | 実行コマンド / 設定 | 要点 |
|---|---|---|
| コマンドラインで testhost を x86 に固定 | vstest.console.exe MyTests.dll /Platform:x86 | --x86 ではなく /Platform:x86 を使用。vstest.console.exe は親プロセスとして動き、子プロセスの testhost を x86 で起動します。 |
| 設定ファイルで恒久化(IDE/CLI 共通) | <RunSettings> <RunConfiguration> <TargetPlatform>x86</TargetPlatform> </RunConfiguration> </RunSettings> | ソリューション直下に .runsettings を置き、IDE の「Run Settings」から選択、または「Auto Detect runsettings」を有効化。 |
| .NET CLI で x86 実行 | ビルド済 DLL を走らせる:dotnet vstest MyTests.dll --Platform x86プロジェクトをビルドして走らせる: dotnet test --arch x86 | dotnet test は --arch が効きます。.runsettings の <TargetPlatform> は dotnet test ではアーキ切替に効きません。 |
| IDE(VS 2022)の Test メニューで切替 | 「Test > Processor Architecture for AnyCPU Projects > x86」 | AnyCPU のテスト DLL に対して、IDE 側で実行時アーキを一括指定できます。 |
| ホストの誤検出を明示的に回避 | <RunSettings> <RunConfiguration> <TargetPlatform>x86</TargetPlatform> <DotnetHostPath>C:\Program Files (x86)\dotnet\dotnet.exe</DotnetHostPath> </RunConfiguration> </RunSettings> | .NET のホスト(dotnet.exe)が x64 を掴んでしまう環境で有効。DotnetHostPath で x86 の dotnet を明示。 |
なぜ「vstest.console.exe 自体の 32 ビット版」が不要なのか
Visual Studio 2022 では IDE 自体が 64 ビット化され、同梱の vstest.console.exe も 64 ビット配置(Program Files 側)になりました。ここで重要なのは「vstest.console.exe はあくまで“親”」という点です。実際にテストを実行するのは子プロセスの testhost.exe(.NET Framework)または testhost.dll(.NET / .NET Core)であり、/Platform や .runsettings の指定に基づいて、この testhost が x86 で起動します。つまり、親の vstest.console が 64 ビットでも、子の testhost を 32 ビットで起動できるため、多くのケースで “vstest.console の 32 ビット版そのもの” を探す必要はありません。
実行モード別の正しいスイッチと注意点
vstest.console.exe(VS が同梱するテストランナー)
- コマンドは
/Platform:x86を使用します(--x86は無効)。 /Settings:xxx.runsettingsで<TargetPlatform>x86</TargetPlatform>を適用できます。- 実行中はタスク マネージャーで
testhost.exe *32が起動しているか確認すると確実です。
vstest.console.exe .\tests\MyTests.dll /Settings:.runsettings /Platform:x86 /logger:trx
dotnet vstest(.NET CLI から VSTest を叩く)
- ビルド済みの DLL を直接テストしたいときに有効です。
--Platform x86を使用します。
dotnet vstest .\artifacts\bin\MyTests\net8.0\MyTests.dll --Platform x86
dotnet test(プロジェクトをビルドしてテスト)
--arch x86でテストホスト実行のアーキテクチャを指定します。.runsettingsの<TargetPlatform>はdotnet testのアーキ切替には影響しません(--archまたは x86 の dotnet を使う必要があります)。--archと-r|--runtimeは併用しないのが安全策です。
dotnet test .\tests\MyTests\MyTests.csproj --arch x86 -c Release -l "trx;LogFileName=test.trx" -s .runsettings
dotnet x86 を明示したい場合
環境に x64 と x86 両方の .NET が入っていると、パスの解決順によって x64 の dotnet が使われることがあります。確実に x86 を使いたいなら、次のいずれかで固定します。
set PATH=C:\Program Files (x86)\dotnet;%PATH%のように PATH を先頭に通す。- 前述の
DotnetHostPathを.runsettingsに設定。
.runsettings のベストプラクティス
最小構成(x86 固定)
<RunSettings>
<RunConfiguration>
<TargetPlatform>x86</TargetPlatform>
</RunConfiguration>
</RunSettings>
ホストの誤検出対策(.NET x86 を固定)
<RunSettings>
<RunConfiguration>
<TargetPlatform>x86</TargetPlatform>
<DotnetHostPath>C:\Program Files (x86)\dotnet\dotnet.exe</DotnetHostPath>
</RunConfiguration>
</RunSettings>
プロジェクト/ソリューションへの適用
- ソリューション直下の
.runsettingsを「Auto Detect runsettings」で自動検出。 - IDE の「Test > Configure Run Settings」で手動選択も可。
Directory.Build.propsやプロジェクトのPropertyGroupにRunSettingsFilePathを入れると、メンバー全員に行き渡らせやすくなります。
<Project>
<PropertyGroup>
<RunSettingsFilePath>$(SolutionDir).runsettings</RunSettingsFilePath>
</PropertyGroup>
</Project>
IDE(Visual Studio 2022)での設定ポイント
- AnyCPU テストの実行アーキは「Test > Processor Architecture for AnyCPU Projects」で切替可能(x86 / x64)。
- テストの挙動は使用ランナー(VSTest か MSTest ランナー)でも変わります。VSTest モードでは
/PlatformとTargetPlatformが効きます。 - ソリューション単位で
.runsettingsを選択すれば、メニューからの変更よりブレにくくなります。
ネイティブ DLL 連携の実務ノウハウ
配置ディレクトリの落とし穴
x86 に切替えても、依存 DLL(例:mylib.dll)が bin\x64 側に置かれていると DllNotFoundException を引き起こします。CopyToOutputDirectory とターゲット毎の出力ディレクトリを整理しましょう。
<ItemGroup>
<None Include="native\x86\mylib.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>mylib.dll</Link>
</None>
</ItemGroup>
NuGet のランタイム別配置(推奨)
自作ライブラリなら、runtimes/win-x86/native/mylib.dll の形でパッケージングすると、テスト/本番いずれも配置が安定します。
テストコードからビット数を自己診断
[Fact]
public void ホストは32ビットで起動しているはず()
{
Assert.True(Environment.Is64BitProcess == false);
Assert.Equal(4, IntPtr.Size); // 32bit は 4
}
CI/CD(エージェント)で x86 テストを安定させる
汎用スクリプト例(Windows, PowerShell)
# x86 の dotnet を優先
$env:PATH = "C:\Program Files (x86)\dotnet;" + $env:PATH
# ログ出力フォルダ
$results = "$pwd\TestResults"
mkdir $results -ea 0 | Out-Null
# .runsettings で情報収集+ --arch x86 で実行
dotnet test .\tests\MyTests\MyTests.csproj ` --arch x86 -c Release`
-s .runsettings ` --results-directory $results`
-l "trx;LogFileName=tests.trx"
vstest.console を使うパイプライン
vstest.console.exe .\artifacts\bin\MyTests\net8.0\MyTests.dll ^
/Platform:x86 ^
/Settings:.runsettings ^
/Logger:trx
ホストの解決に失敗する場合は、環境変数の DOTNET_ROOT(x86) / DOTNET_ROOT を使い分ける、あるいは .runsettings の DotnetHostPath で明示固定すると安定します。
トラブルシューティング(よくある 10 のつまずき)
- 「x86 にしたはずなのに 64 ビットで起動する」
vstest.consoleの場合:/Platform:x86を付け忘れていないか確認。dotnet testの場合:--arch x86が必須。TargetPlatformは効きません。DotnetHostPathで x86 のdotnet.exeを明示するのも効果的。
- .runsettings が適用されていない
ファイル名の拡張子が.runsettingsになっているか、ソリューション直下か、IDE で選択されているかを再確認。 - AnyCPU テストでの混乱
AnyCPU のままでも、IDE の「Processor Architecture for AnyCPU Projects」で x86 指定が可能。チームで共有したい場合は .runsettings の併用が安全。 - ネイティブ DLL の見つからないエラー
出力先のbin\x86に配置されているか、またはruntimes/win-x86/native経由で取り込めているかを点検。 - パスが x64 の dotnet を指してしまう
CI では PATH の先頭にC:\Program Files (x86)\dotnetを通すか、DotnetHostPathを設定。 - テストアダプタの不一致
Microsoft.NET.Test.Sdkと各フレームワーク(xUnit/NUnit/MSTest)のバージョン整合を確認。古いアダプタはアーキ検出に不具合を起こすことあり。 - ARM 環境での挙動
Windows on Arm 環境では WoW64/エミュレーションにより x86/x64 の動作が混在します。安定させるには--archまたは/PlatformとDotnetHostPathを併用。 - コードカバレッジやデータコレクタで落ちる
x86 化により収集器の依存が変わる場合があります。まずはコレクタを無効化して再実行し、段階的に戻すのが安全。 - テストが検出されない
実行対象の DLL がターゲット フレームワークと合っているか(例:net8.0)、アダプタが正しく参照されているか確認。 - 「それでも 32 ビット版 vstest.console が欲しい」
実務上は不要です。どうしても単体の 32 ビット ランチャーが必要な場合は、x86 のdotnet.exeとdotnet vstestを使う方がトラブルが少なく、保守も容易です。
仕組みの理解:テストホストとアーキテクチャ選択
- VSTest モード(
vstest.console/dotnet vstest/ VS Test Explorer):
親のランナーは 64 ビットでも、/Platformと<TargetPlatform>に従い testhost を x86 で起動。 - .NET CLI(dotnet test):
既定では「パスにある dotnet のビット数」を使うため、--arch x86か x86 のdotnetを使う必要があります。TargetPlatformはこの振る舞いを上書きしません。 - DotnetHostPath:
.runsettingsのRunConfigurationに指定できる “テストホスト起動に使う dotnet のパス”。解決順の揺らぎを排除し、再現性を高めます。
チェックリスト(1 分で確認)
- テスト実行時にタスク マネージャーで testhost.exe *32 が見えるか。
Environment.Is64BitProcess == falseを検証するテストが通るか。vstest.consoleなら/Platform:x86、dotnet testなら--arch x86を付けているか。.runsettingsはソリューション直下 & Auto Detect が ON か(または手動選択済み)。- ネイティブ DLL は
bin\x86かruntimes/win-x86/nativeに配置されているか。 - 必要に応じて
DotnetHostPathにC:\Program Files (x86)\dotnet\dotnet.exeを設定しているか。
ケーススタディ:SQLite の x86 ネイティブ DLL に依存するテスト
以下は「SQLite の x86 ネイティブ DLL に依存する」想定の最小構成です。ポイントは 3 つだけです。
/Platform:x86(または--arch x86)<TargetPlatform>x86</TargetPlatform>- 依存 DLL を
bin\x86へ確実に配置
.runsettings
<RunSettings>
<RunConfiguration>
<TargetPlatform>x86</TargetPlatform>
<ResultsDirectory>.\TestResults</ResultsDirectory>
</RunConfiguration>
</RunSettings>
csproj(抜粋)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<PlatformTarget>x86</PlatformTarget>
<IsPackable>false</IsPackable>
</PropertyGroup>
PreserveNewest
sqlite3.dll
実行
# VS 同梱ランナーで
vstest.console.exe .\bin\x86\Debug\net8.0\MyTests.dll /Platform:x86 /Settings:.runsettings
# .NET CLI で
dotnet test --arch x86 -s .runsettings
FAQ
Q. VS 2019 に戻さないと x86 テストは無理?
A. 不要です。VS 2022 でも /Platform:x86 や --arch x86、DotnetHostPath で確実に x86 実行できます。
Q. プロジェクトを x86 でビルドしているのに 64 ビットで起動します
A. ビルド構成(PlatformTarget)と実行アーキは別です。vstest.console は /Platform、dotnet test は --arch で“実行時”を指定してください。
Q. .runsettings の TargetPlatform だけで十分?
A. vstest.console/VS では有効ですが、dotnet test の実行アーキ切替には効きません。CLI の場合は --arch x86 を使いましょう。
Q. 「vstest.console.exe の 32 ビット版」をどこかから入手できますか?
A. 実務上のメリットは乏しく、推奨しません。vstest.console が 64 ビットでも、子の testhost を x86 で起動できます。どうしても単体 EXE の運用が必要なら、x86 の dotnet と dotnet vstest を活用するのが現実的です。
Q. MSTest / xUnit / NUnit で違いはありますか?
A. いずれも VSTest 経由で動く限りは上記のルールに従います。アダプタや SDK のバージョン差で挙動が変わる場合があるので、テスト基盤のバージョンはなるべく揃えてください。
まとめ
- VS 2022 環境でも x86 テストは完全に可能。
/Platform:x86、<TargetPlatform>x86</TargetPlatform>、--arch x86を正しく使い分ける。 - CLI でのアーキ切替は
dotnet test --arch x86が確実。TargetPlatformはdotnet testには効かない点に注意。 - ホスト誤検出は
DotnetHostPathで x86 のdotnet.exeを明示して回避。 - ネイティブ DLL の配置とアダプタの整合性を見直すと、x86 化によるエラーの大半は解決します。
これらを押さえておけば、「32 ビット依存のライブラリを VS 2022 でテストできない」という悩みはきれいに解消できます。

コメント