none
実行ファイルにマニュフェストが埋め込まれません RRS feed

  • 質問

  • 実行ファイルの最後にマニュフェストというのでしょうか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.02046

    Visual 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

    2017年9月21日 6:56

回答

  • プロジェクトファイル(*.csproj)をメモ帳などで開いて、win32manifestタグを追加して指定すると埋め込んでくれます。

      <PropertyGroup>
        <ApplicationManifest>Properties\app.manifest</ApplicationManifest>
        <win32manifest>$(ApplicationManifest)</win32manifest>
        <!-- 直接パス指定でも可能だが、ApplicationManifestタグ以降であれば$(ApplicationManifest)で指定できる。 -->
      </PropertyGroup>


    win32manifestコンパイラオプション


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年9月21日 8:48
  • はい。チェックがオンの場合はマニフェストが埋め込まれないようです。

    デフォルトではチェックはオフで、発行を行うとチェックがオンになってしまうようです。

    • 編集済み kenjinoteMVP 2017年9月21日 9:55
    • 回答としてマーク kmetu 2017年9月21日 10:11
    2017年9月21日 9:51
  • ソースコードを追いかけ、質問の実行ファイルにマニュフェストを埋め込むだけの修正方法を確認しました。「発行」を行うとプロジェクトファイルがいろいろと書き換えられますが、その中に

      <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さんの方法ではなんで動くんでしたっけ…。

    2017年9月21日 10:15
  • すみません。こちらでも発行を行った後、上記だけの設定ではマニフェストが埋め込まれませんでした。

    プロジェクトのプロパティで「セキュリティ」タブを開き、「ClickOnce セキュリティ設定を有効にする(N)」のチェックをオフにしてビルドしてみると、マニフェストが埋め込まれるようになりました。プロジェクトを作成した直後と同じマニフェストを埋め込むには、マニフェストの設定で「マニフェストを既定の設定で埋め込みます」を選びなおす必要があるようです。

    • 編集済み kenjinoteMVP 2017年9月21日 9:33
    • 回答としてマーク kmetu 2017年9月21日 10:18
    2017年9月21日 8:57

すべての返信

  • 確認方法は適切でしょうか?

    ビルドした実行ファイルをVisual Studio自身で開いてみてください。その際に「リソースエディター」を選択します。図のように RT_MINIFEST の項目の下に 1 が表れていれば埋め込まれています。この 1 の項目をエクスポートすることができます。保存の際のファイル名が既定で bin.bin となっていますが拡張子を .xml に変更することで実際に埋め込まれているマニフェストの内容も確認できます。

    2017年9月21日 7:11
  • さきほどに引き続き回答ありがとうございます。

    確認はバイナリエディタなどでファイルを開いて目視でしていました。

    ご案内いただいた方法で見てみましたがRT_MINIFESTという項目はありませんでした。

    他に確認するところがありましたらよろしくお願いします。


    kmetu

    2017年9月21日 7:43
  • 追加情報です。

    ソリューションのクリーンをして再度ソリューションのビルドをしても結果は同じでした。

    ちなみにビルド後にできるファイルとフォルダは以下の通りです。

    app.publish フォルダ (中には ProjectX.exe があります)   
    ProjectX.application   : Application Manifestファイル
    ProjectX.exe        
    ProjectX.exe.config    : XML Configuration File
    ProjectX.exe.manifest  : Manifestファイル

    以上何かお分かりになりましたらよろしくお願いします。


    kmetu

    2017年9月21日 8:16
  • ProjectX.exe.manifest ではダメなのですか?
    2017年9月21日 8:24
  • 特にマニフェストを独自にカスタマイズしていないのでしたら、

    下記のマニフェストの設定で「マニフェストを既定の設定で埋め込みます」を選びなおせば元に戻ります。

    2017年9月21日 8:27
  • ProjectX.exe.manifestはたぶんセットアップ用のマニュフェストファイルじゃないかと思ってます。

    実行ファイルに埋め込まれるxmlは10行くらいでファイルの最後に記載されていたのですが、こちらは98行のxmlファイルになっています。


    kmetu

    2017年9月21日 8:47
  • 回答ありがとうございます。

    ご案内いただいた方法を試しましたが埋め込まれませんでした。


    kmetu

    2017年9月21日 8:48
  • プロジェクトファイル(*.csproj)をメモ帳などで開いて、win32manifestタグを追加して指定すると埋め込んでくれます。

      <PropertyGroup>
        <ApplicationManifest>Properties\app.manifest</ApplicationManifest>
        <win32manifest>$(ApplicationManifest)</win32manifest>
        <!-- 直接パス指定でも可能だが、ApplicationManifestタグ以降であれば$(ApplicationManifest)で指定できる。 -->
      </PropertyGroup>


    win32manifestコンパイラオプション


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年9月21日 8:48
  • すみません。こちらでも発行を行った後、上記だけの設定ではマニフェストが埋め込まれませんでした。

    プロジェクトのプロパティで「セキュリティ」タブを開き、「ClickOnce セキュリティ設定を有効にする(N)」のチェックをオフにしてビルドしてみると、マニフェストが埋め込まれるようになりました。プロジェクトを作成した直後と同じマニフェストを埋め込むには、マニフェストの設定で「マニフェストを既定の設定で埋め込みます」を選びなおす必要があるようです。

    • 編集済み kenjinoteMVP 2017年9月21日 9:33
    • 回答としてマーク kmetu 2017年9月21日 10:18
    2017年9月21日 8:57
  • 質問文をよく読んでいませんでした。

    たぶん「発行」をした後から

    発行した後とのことですが、ClickOnceによる発行をしたいのでしょうか? 意図せず誤って「発行」を実行してしまったのでしょうか?

    前者であれば、app.publishディレクトリ下にmanifestファイルが分離して置かれているようです。

    後者であれば、どうなんでしょう、私は取り消し方を知りません。プロジェクトファイルの不要部分を削除すれば元に戻ると思いますが。

    2017年9月21日 9:15
  • 回答ありがとうございます。

    ご案内の方法で試したところ埋め込まれましたが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

    2017年9月21日 9:27
  • ClickOnceによる発行をしたいというわけではなく「発行」するとなにができるのか試しに実行してみたというところです。

    佐祐理さまのご意見をうかがって「プロジェクトファイルの不要部分を削除すれば」か、どこかを書き換えればという気がしています。


    kmetu

    2017年9月21日 9:35
  • テストしていただきありがとうございます。ただ、そこのところは有効になっていました。

    kmetu

    2017年9月21日 9:45
  • はい。チェックがオンの場合はマニフェストが埋め込まれないようです。

    デフォルトではチェックはオフで、発行を行うとチェックがオンになってしまうようです。

    • 編集済み kenjinoteMVP 2017年9月21日 9:55
    • 回答としてマーク kmetu 2017年9月21日 10:11
    2017年9月21日 9:51
  • あっすみません。オンにするのだと読み違えてました。オフにしたら埋め込まれました!!長いxmlも「既定の設定で埋め込みます」にしたら短いもとのマニュフェストに戻りました。

    Properties\app.manifestというのを自分では変更した覚えがないのですが、これ自体が長いのでそのせいで長くなってしまったようです。

    チェックが自動でオンになるなどの情報もたいへん参考になりました。自分で変更してなくて最初からオンだと信じてましたので、オフにするというのは考えもしませんでした。

    テストまでしていただき回答どうもありがとうございました。


    kmetu

    2017年9月21日 10:11
  • xmlが長くなったのはProperties\app.manifestこれ自体が長いのでそのせいでした。

    失礼しましたm(__)m


    kmetu

    2017年9月21日 10:14
  • ソースコードを追いかけ、質問の実行ファイルにマニュフェストを埋め込むだけの修正方法を確認しました。「発行」を行うとプロジェクトファイルがいろいろと書き換えられますが、その中に

      <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さんの方法ではなんで動くんでしたっけ…。

    2017年9月21日 10:15
  • ClickOnceのセキュリティ設定が「発行」すると勝手にオンになるのが原因でした。

    どうもありがとうございました。


    kmetu

    2017年9月21日 10:17
  • 凄く細かいところまで調べていただきありがとうございましたm(__)m

    Release ディレクトリはソリューションのクリーンできれいにして、kenjinoteさまに回答いただいたセキュリティをオフにするという設定で元にもどったようです。ありがとうございました。


    kmetu

    2017年9月21日 10:33