none
Web サイトプロジェクトをプリコンパイルし、バージョン付きアセンブリを作成する方法について RRS feed

  • 質問

  • Visual Studio 2010 Professional
    ASP.NET4(C#)で
    http://msdn.microsoft.com/ja-jp/library/ms228042%28v=vs.100%29.aspx
    を参考に、Webサイトプロジェクトをプリコンパイルし、アセンブリに
    バージョン情報等を設定したいのですが上手くいきません。

    プリコンパイルは
    aspnet_compiler -p [path] -v / -fixednames [targetPath]
    のようにしています。

    上記サイトにある「アセンブリ情報ファイルを .aspx ページに指定するには」の方法では、
    設定を行った該当のaspxページのdllにアセンブリ情報は設定されません。
    aspxファイルには
    <%@ Page language="c#" CodeFile="[aaaa].aspx.cs" AutoEventWireup="false" Inherits="[bbbb]" CompilerOptions="[path]\AssemblyInfo.cs" %>
    のように指定しています。

    また、「アセンブリ情報ファイルを Web.config ファイルに指定するには」の方法では、
    App_Code.dllやApp_GlobalResources.dllなどバージョンが設定されるアセンブリもあれば、
    App_Web_[xxxx].aspx.[aaaaaaaa].dll、App_Web_[yyyy].ascx.[bbbbbbbb].dllなどバージョンが
    設定されないものもあります。(但し、バージョンが設定されないApp_Web_[xxxx].aspx.[aaaaaaaa].dll、
    App_Web_[yyyy].ascx.[bbbbbbbb].dllと元々同じ階層にあった同じ拡張子のファイルでもバージョンが
    設定されているものもあり、規則性が分かりません。)
    Web.configには上記サイト記載の内容で設定しています。([path]は実際の環境。compilerOptionsにはaspxもWeb.configも同じ値を設定しています。)

    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
                type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3600.0, Culture=neutral,
                PublicKeyToken=b77a5c561934e089" warningLevel="1"
                compilerOptions="[path]\AssemblyInfo.cs" />
    </compilers>

    正しくアセンブリにバージョン情報等の設定を行う方法を教えてください。
    また、compilerOptionsには現在フルパスを設定しているのですが、相対パス指定はできないでしょうか?
    相対パスの指定の仕方を教えてください。

    よろしくお願いします。

    2012年4月18日 8:18

回答

  • この辺りはかなり悲惨な実装と言わざるを得ません。バージョン番号が付与されない点についてMS社に問い合わせたことがありましたがその際の正式回答として「仕様である」と言われました。
    # どうみても付け忘れなんですけどね。

    また相対パスも指定できません。しかもこのcompilersを含むweb.configをそのまま配布するとWebサーバー側でもAssemblyInfo.csをコンパイルしようとして探しに行きますし…はっきりってリンク先の方法は実運用向きではありません。

    別の問題としてファイル数が多すぎて管理しづらい点もあります。その回避策としてaspnet_merge.exeがあります。これを使うと指定したファイル名の単一ファイルになるため管理しやすくなるでしょう。ただしバージョン番号が付かない点は変わりありません。仕方がないのでAssemblyInfo.csをコンパイルし、ilmerge.exeにて結合するくらいしか対策がありませんでした。

    • 回答としてマーク leleleoleo 2012年4月18日 9:56
    2012年4月18日 9:14

すべての返信

  • この辺りはかなり悲惨な実装と言わざるを得ません。バージョン番号が付与されない点についてMS社に問い合わせたことがありましたがその際の正式回答として「仕様である」と言われました。
    # どうみても付け忘れなんですけどね。

    また相対パスも指定できません。しかもこのcompilersを含むweb.configをそのまま配布するとWebサーバー側でもAssemblyInfo.csをコンパイルしようとして探しに行きますし…はっきりってリンク先の方法は実運用向きではありません。

    別の問題としてファイル数が多すぎて管理しづらい点もあります。その回避策としてaspnet_merge.exeがあります。これを使うと指定したファイル名の単一ファイルになるため管理しやすくなるでしょう。ただしバージョン番号が付かない点は変わりありません。仕方がないのでAssemblyInfo.csをコンパイルし、ilmerge.exeにて結合するくらいしか対策がありませんでした。

    • 回答としてマーク leleleoleo 2012年4月18日 9:56
    2012年4月18日 9:14
  • 佐祐理さま
    返信ありがとうございます。

    そうなんですね…。残念です。
    対策までありがとうございます。調査してみます。

    2012年4月18日 9:56