C# コンパイラエラー CS1564 の原因と対処法について解説
CS1564はC#のコンパイラエラーで、/Win32resオプションを指定している場合に、/win32manifestオプションを同時に使用すると発生します。
設定が競合し、カスタムマニフェストがリソースファイルに含まれず正常なビルドができなくなるため、マニフェストをリソースファイルに統合し、/win32manifestオプションの指定を控える必要があります。
CS1564の概要
このセクションでは、コンパイラエラー CS1564 の基本的な内容について説明します。
エラー CS1564 は、/Win32res オプションと /win32manifest オプションの両方が指定された場合に発生する競合について知らせるエラーです。
両方のオプションが同時に使用できない点に注意する必要があります。
エラーコードと発生状況
エラーコード CS1564 は、主にビルド時に現れます。
具体的には、開発環境で /Win32res オプションを指定してコンパイルする際、外部で提供されたマニフェストがリソースファイルに正しく組み込まれていない場合に発生します。
プロジェクト設定で /win32manifest オプションが指定されている場合に、このエラーが報告されることが多いです。
主要なエラーメッセージの内容
エラーメッセージには「競合するオプションが指定されました: Win32 リソース ファイル、Win32 マニフェスト。」と表示されます。
これは、/Win32res を使用する場合、カスタムの Win32 マニフェストをリソースファイルに直接含めなければならないにも関わらず、/win32manifest オプションを別途指定しているために起こる競合を示しています。
エラー発生の原因
このセクションでは、なぜ CS1564 エラーが発生するのか、その具体的な原因について解説します。
/Win32resオプションの指定
/Win32res オプションは、コンパイル時にカスタムのリソースファイルを指定するために用いられます。
このオプションを使用すると、既定のリソースに代わり、開発者が用意したリソースファイルがバイナリに組み込まれます。
リソースファイルにマニフェスト情報が含まれていない場合、正しいアプリケーションの実行情報が提供できず、エラーにつながる可能性があります。
/win32manifestオプションとの競合
/Win32res オプションと /win32manifest オプションは、どちらもアプリケーションにマニフェスト情報を付加するために使用されます。
しかし、両方を同時に指定することはできません。
競合する設定の詳細
両者の競合は、/Win32res で指定したリソースファイルにマニフェストが含まれていない一方、/win32manifest オプションで別途マニフェストファイルを指定している場合に発生します。
この設定の不整合が、コンパイラに対してどちらを優先すべきか曖昧な状態を作り出し、エラー CS1564 を引き起こします。
リソースファイルへの追加が求められる理由
/Win32res オプションを使用する場合、カスタムリソースファイルへマニフェスト情報を組み込む必要があります。
これは、アプリケーションが実行時に正しいセキュリティ情報や依存関係情報を取得するために不可欠です。
別途 /win32manifest オプションを使ってしまうと、リソースファイルとマニフェスト情報が分離し、両者の整合性が取れなくなるためエラーが発生します。
対処法
このセクションでは、CS1564 エラーを解決するための具体的な方法について説明します。
主な方法は、マニフェスト情報をリソースファイルへ統合し、/win32manifest オプションを削除することです。
マニフェストの統合方法
正しい対策としては、カスタムの Win32 マニフェストをリソースファイルに統合し、/win32manifest オプションの指定を削除する手順です。
これにより、マニフェストが一元的に管理され、オプション同士の競合が解消されます。
リソースファイルへのマニフェスト追加手順
リソースファイルにマニフェストを追加する手順は以下の通りです。
- カスタムマニフェストファイル(例:
app.manifest
)を用意します。
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
- 用意したマニフェストファイルをリソースコンパイラや他のツール(例えば
mt.exe
)を使用して、リソースファイルに統合します。 - プロジェクト設定で /win32manifest オプションを削除し、/Win32res オプションで作成したリソースファイルを指定します。
以下に、統合済みのリソースを利用してシンプルなサンプルコードを示します。
// Program.cs
using System;
namespace ManifestIntegrationSample
{
class Program
{
// Mainメソッド:エントリーポイント
static void Main(string[] args)
{
// アプリケーションが正しくマニフェストを読み込めたか確認するためのメッセージ
Console.WriteLine("マニフェストがリソースに統合されています。");
}
}
}
マニフェストがリソースに統合されています。
コンパイラオプションの修正方法
コンパイラオプションの修正は、以下の手順で行います。
- プロジェクトファイルやビルドスクリプトから
/win32manifest
オプションを削除する。 - 代わりに、正しくマニフェスト情報が組み込まれたリソースファイルを
/Win32res
オプションで指定する。
例えば、コマンドラインでコンパイルする場合は以下のように指定します。
csc /Win32res:IntegratedResource.res Program.cs
開発環境別の設定例
ここでは、Visual Studio とコマンドラインの場合のそれぞれの設定例を紹介します。
Visual Studioでの対応
Visual Studio を使用している場合、プロジェクトのプロパティから設定変更が可能です。
手順は以下の通りです。
- プロジェクトの「プロパティ」を開きます。
- 「アプリケーション」タブで、「リソースファイル」または「マニフェスト」オプションに関する設定項目を確認します。
- カスタムマニフェストが組み込まれたリソースファイルを指定したうえで、
/win32manifest
の項目を無効にします。
この設定により、Visual Studio のビルドプロセスが統合リソースを正しく利用するようになります。
コマンドラインによる設定変更
コマンドラインでコンパイルする場合、以下の点に注意してください。
/win32manifest
オプションを指定せず、代わりにマニフェストが統合されたリソースファイルを指定します。- 具体例として、以下のコマンドを実行します。
csc /Win32res:IntegratedResource.res Program.cs
この指定により、統合されたマニフェスト情報がリソースファイルから読み込まれ、エラー CS1564 が解消されます。
まとめ
この記事では、コンパイラエラー CS1564 の原因と対処法が理解できます。
/Win32res オプションと /win32manifest オプションの競合がエラー発生の根本にあり、正しく統合されたリソースファイルを利用することでエラーを回避できる点を解説しています。
Visual Studio やコマンドラインでの具体的な設定例により、実際の開発環境での適用方法も身につきます。