ASP.NETにおけるWebリソースとのILMerge問題の解決方法

ASP.NETアプリケーションを扱う際、開発者は複数のDLLを単一の実行可能ファイルにマージするという課題に直面することがよくあります。この手法は、展開とバージョン管理の簡素化に役立ちます。ILMergeはこの作業に素晴らしいツールですが、Webリソースに関して予期しない問題を引き起こすことがあります。

この記事では、ILMergeを使用してDLLをマージした後にClientScript.RegisterClientScriptResourceで発生する404エラーの問題を探求し、この問題を修正するためのステップバイステップのソリューションをご紹介します。

問題の理解

ILMergeを使用してDLLをマージすると、マージ前は正常に機能していたJavaScriptリソースにアクセスした際に404エラーが発生することがあります。この問題は、異なるDLLからのWebリソースのアセンブリ属性がマージされたアセンブリに正しく保持されないことに起因します。

例としてのシナリオ

以下のように定義されたコントロールを考えてみましょう。

namespace Company.WebControls
{
  public class ControlA : CompositeControl, INamingContainer
  {
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        this.Page.ClientScript.RegisterClientScriptResource(typeof(ControlA), "Company.WebControls.ControlA.js");                
    }      
  }
}

ここで、ControlA.jsは埋め込まれたリソースです。AssemblyInfo.csでは次のようにマークされています。

[assembly: System.Web.UI.WebResource("Company.WebControls.ControlA.js", "application/x-javascript")]

必要なDLLをすべてCompanyA.dllにマージした後、ControlA.jsにアクセスすると404エラーが発生することが分かります。

解決策

この問題を解決するための鍵は、マージプロセス中にアセンブリ属性を正しく処理することです。以下の手順で行います。

ステップ1: ダミープロジェクトの作成

  1. Webリソースを含むすべてのDLLを参照するダミープロジェクトを設定します。
  2. 元のプロジェクトからダミープロジェクトのAssemblyInfo.csにすべてのWebリソースを含めます。

ステップ2: AssemblyInfo.csの調整

ダミープロジェクトのAssemblyInfo.csが次のようになることを確認します。

[assembly: System.Web.UI.WebResource("Company.WebControls.ControlA.js", "application/x-javascript")]
// 他のプロジェクトから必要な追加リソースを含める

ステップ3: ILMergeコマンドの正しい使用

ILMergeコマンドラインを次のように更新します。

"C:\Program Files\Microsoft\ILMerge\ILMerge.exe" /keyfile:../../Company.snk /wildcards:True /out:Company.dll Company.Merge.dll Company.*.dll

このコマンドにより、必要なWebリソース属性が含まれていることを確認しつつDLLをマージします。

ステップ4: マージのテスト

更新した構造でマージコマンドを実行した後、アプリケーションをデプロイし、JavaScriptリソースに404エラーなくアクセスできることを確認します。Webコントロールを広範囲にテストし、すべてが正常に機能していることを確認してください。

結論

ILMergeでDLLをマージすることは、展開を簡素化できますが、ASP.NETアプリケーションのWebリソースに関する課題を引き起こす可能性があります。Webリソース属性を統合するためのダミープロジェクトを作成することで、マージ後に埋め込まれたJavaScriptファイルが正しく読み込まれることを保証できます。

この解決策を実施することで、マージされたアセンブリのシームレスな統合を確保し、重要なクライアントサイドリソースへのアクセスを維持することができます。

持続的な問題が発生する場合は、ILMergeのドキュメントを再確認するか、より複雑なシナリオに対してコミュニティからサポートを求めることを検討してください。

この知識を持っていれば、ASP.NETにおけるDLLマージの困難を効果的に乗り越え、アプリケーションが意図した通りに動作することを確保できます。