トップ回答者
実行ファイルにマニュフェストが埋め込まれません

質問
-
実行ファイルの最後にマニュフェストというのでしょうかxmlが記載されると思うのですが、記載されなくなってしまいました。
たぶん「発行」をした後からだと思うのですが、ふと確認したら記載されてなかったという状況ですのでそのあたりが断定できません。プロパティのアプリケーションに設定されている
Properties\app.manifestは存在しますし、ここの設定を既定の設定で埋め込むにしても記載されません。
また、app.manifestは自動で作成されたまま中身は何も変更していません。現在のバージョンは
Microsoft Visual Studio Community 2017
Version 15.3.5
VisualStudio.15.Release/15.3.5+26730.16
Microsoft .NET Framework
Version 4.7.02046Visual C# 2017 00369-60000-00001-AA065
Microsoft Visual C# 2017
ですが、以下のバージョンの時に現象が発生しました。Microsoft Visual Studio Community 2017
Version 15.2 (26430.16) Release
VisualStudio.15.Release/15.2.0+26430.16
Microsoft .NET Framework
Version 4.7.02046どこか、別のところの設定が関係しているのでしょうか。
kmetu
回答
-
プロジェクトファイル(*.csproj)をメモ帳などで開いて、win32manifestタグを追加して指定すると埋め込んでくれます。
<PropertyGroup> <ApplicationManifest>Properties\app.manifest</ApplicationManifest> <win32manifest>$(ApplicationManifest)</win32manifest> <!-- 直接パス指定でも可能だが、ApplicationManifestタグ以降であれば$(ApplicationManifest)で指定できる。 --> </PropertyGroup>
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 編集済み gekkaMVP 2017年9月21日 8:54 コンパイラオプション説明へのリンク追加
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月22日 1:17
- 回答としてマーク kmetu 2017年9月22日 1:34
-
ソースコードを追いかけ、質問の実行ファイルにマニュフェストを埋め込むだけの修正方法を確認しました。「発行」を行うとプロジェクトファイルがいろいろと書き換えられますが、その中に
<PropertyGroup> <GenerateManifests>true</GenerateManifests> </PropertyGroup>
という設定が追加されます。この true を false に変更する(もしくは上記引用部分を丸ごと削除する)ことで、ClickOnceマニフェストファイルを生成しなくなると共に、アプリケーションマニフェストが実行ファイルに埋め込まれるように動作が変更されます。プロパティ画面において、この設定変更に対応する画面操作を見つけることはできませんでした。
とはいえ、一度「発行」を行うと bin\Release ディレクトリに生成されるファイルもいろいろと変化しているかと思います。ClickOnceによる発行を行う意思がないのであれば、上記設定だけでなく、一通り元の設定に戻すことをお勧めします。
$GenerateManifest=trueが設定されるとMicrosoft.Common.CurrentVersion.targetsにて$GenerateClickOnceManifests=trueとなり$NoWin32Manifest=trueとなり最終的にCscタスクのNoWin32Manifestパラメーターがtrueになるために埋め込まれなくなります。
# gekkaさんの方法ではなんで動くんでしたっけ…。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月22日 1:17
- 回答としてマーク kmetu 2017年9月22日 1:34
-
すみません。こちらでも発行を行った後、上記だけの設定ではマニフェストが埋め込まれませんでした。
プロジェクトのプロパティで「セキュリティ」タブを開き、「ClickOnce セキュリティ設定を有効にする(N)」のチェックをオフにしてビルドしてみると、マニフェストが埋め込まれるようになりました。プロジェクトを作成した直後と同じマニフェストを埋め込むには、マニフェストの設定で「マニフェストを既定の設定で埋め込みます」を選びなおす必要があるようです。
- 編集済み kenjinoteMVP 2017年9月21日 9:33
- 回答としてマーク kmetu 2017年9月21日 10:18
すべての返信
-
確認方法は適切でしょうか?
ビルドした実行ファイルをVisual Studio自身で開いてみてください。その際に「リソースエディター」を選択します。図のように RT_MINIFEST の項目の下に 1 が表れていれば埋め込まれています。この 1 の項目をエクスポートすることができます。保存の際のファイル名が既定で bin.bin となっていますが拡張子を .xml に変更することで実際に埋め込まれているマニフェストの内容も確認できます。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月26日 7:07
-
追加情報です。
ソリューションのクリーンをして再度ソリューションのビルドをしても結果は同じでした。
ちなみにビルド後にできるファイルとフォルダは以下の通りです。
app.publish フォルダ (中には ProjectX.exe があります)
ProjectX.application : Application Manifestファイル
ProjectX.exe
ProjectX.exe.config : XML Configuration File
ProjectX.exe.manifest : Manifestファイル以上何かお分かりになりましたらよろしくお願いします。
kmetu
-
特にマニフェストを独自にカスタマイズしていないのでしたら、
下記のマニフェストの設定で「マニフェストを既定の設定で埋め込みます」を選びなおせば元に戻ります。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月26日 7:07
-
プロジェクトファイル(*.csproj)をメモ帳などで開いて、win32manifestタグを追加して指定すると埋め込んでくれます。
<PropertyGroup> <ApplicationManifest>Properties\app.manifest</ApplicationManifest> <win32manifest>$(ApplicationManifest)</win32manifest> <!-- 直接パス指定でも可能だが、ApplicationManifestタグ以降であれば$(ApplicationManifest)で指定できる。 --> </PropertyGroup>
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 編集済み gekkaMVP 2017年9月21日 8:54 コンパイラオプション説明へのリンク追加
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月22日 1:17
- 回答としてマーク kmetu 2017年9月22日 1:34
-
すみません。こちらでも発行を行った後、上記だけの設定ではマニフェストが埋め込まれませんでした。
プロジェクトのプロパティで「セキュリティ」タブを開き、「ClickOnce セキュリティ設定を有効にする(N)」のチェックをオフにしてビルドしてみると、マニフェストが埋め込まれるようになりました。プロジェクトを作成した直後と同じマニフェストを埋め込むには、マニフェストの設定で「マニフェストを既定の設定で埋め込みます」を選びなおす必要があるようです。
- 編集済み kenjinoteMVP 2017年9月21日 9:33
- 回答としてマーク kmetu 2017年9月21日 10:18
-
回答ありがとうございます。
ご案内の方法で試したところ埋め込まれましたが80行ほどのxmlが記載されました。
最初記載されていた時には以下のような感じでした(これは他のアプリから拾ったものですので実際とは違います)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>kmetu
-
-
ソースコードを追いかけ、質問の実行ファイルにマニュフェストを埋め込むだけの修正方法を確認しました。「発行」を行うとプロジェクトファイルがいろいろと書き換えられますが、その中に
<PropertyGroup> <GenerateManifests>true</GenerateManifests> </PropertyGroup>
という設定が追加されます。この true を false に変更する(もしくは上記引用部分を丸ごと削除する)ことで、ClickOnceマニフェストファイルを生成しなくなると共に、アプリケーションマニフェストが実行ファイルに埋め込まれるように動作が変更されます。プロパティ画面において、この設定変更に対応する画面操作を見つけることはできませんでした。
とはいえ、一度「発行」を行うと bin\Release ディレクトリに生成されるファイルもいろいろと変化しているかと思います。ClickOnceによる発行を行う意思がないのであれば、上記設定だけでなく、一通り元の設定に戻すことをお勧めします。
$GenerateManifest=trueが設定されるとMicrosoft.Common.CurrentVersion.targetsにて$GenerateClickOnceManifests=trueとなり$NoWin32Manifest=trueとなり最終的にCscタスクのNoWin32Manifestパラメーターがtrueになるために埋め込まれなくなります。
# gekkaさんの方法ではなんで動くんでしたっけ…。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月22日 1:17
- 回答としてマーク kmetu 2017年9月22日 1:34