ASP.NET에서 웹 리소스와 함께 ILMerge 문제 해결하기

ASP.NET 애플리케이션 작업 시, 개발자는 종종 여러 DLL을 단일 실행 파일로 병합하여 배포 및 버전 관리를 용이하게 하는 문제에 직면합니다. 이 작업에 ILMerge 도구는 매우 훌륭하지만, 웹 리소스와 관련된 예기치 않은 문제를 일으킬 수 있습니다.

이 블로그 게시물에서는 ILMerge를 사용하여 DLL을 병합한 후 ClientScript.RegisterClientScriptResource에서 발생하는 404 오류 문제를 살펴보고 이 문제를 수정하기 위한 단계별 솔루션을 제공합니다.

문제 이해하기

ILMerge를 사용하여 DLL을 병합할 때, 병합 이전에 정상적으로 작동하던 JavaScript 리소스에 접근할 때 404 오류가 발생할 수도 있습니다. 이 문제는 서로 다른 DLL의 웹 리소스에 대한 어셈블리 속성이 병합된 어셈블리에서 제대로 유지되지 않기 때문입니다.

예시 시나리오

다음과 같이 정의된 컨트롤을 예로 들어보겠습니다:

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. 웹 리소스를 포함하는 모든 DLL을 참조하는 더미 프로젝트를 설정합니다.
  2. 이 더미 프로젝트의 AssemblyInfo.cs에 원래 프로젝트의 모든 웹 리소스를 포함합니다.

단계 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

이 명령어는 이제 DLL을 병합하면서 필요한 웹 리소스 속성이 포함되도록 해야 합니다.

단계 4: 병합 테스트

업데이트된 구조로 병합 명령어를 실행한 후, 애플리케이션을 배포하고 JavaScript 리소스에 404 오류 없이 접근할 수 있는지 확인합니다. 웹 컨트롤이 올바르게 작동하는지 충분히 테스트하세요.

결론

ILMerge로 DLL을 병합하는 것은 배포를 간소화할 수 있지만 ASP.NET 애플리케이션에서 웹 리소스에 대한 문제를 초래할 수 있습니다. 웹 리소스 속성을 통합하기 위해 더미 프로젝트를 생성함으로써, 병합 후 내장 JavaScript 파일이 올바르게 로드되도록 할 수 있습니다.

이 솔루션을 수행하면 병합된 어셈블리를 원활하게 통합하면서 중요한 클라이언트 측 리소스에 대한 접근을 유지할 수 있습니다.

지속적인 문제가 발생한다면, ILMerge 문서를 검토하거나 보다 복잡한 시나리오에 대해 커뮤니티의 지원을 요청하는 것을 고려하세요.

이 지식을 바탕으로, ASP.NET에서 DLL 병합의 까다로운 과정을 효과적으로 탐색하고 애플리케이션이 원하는 대로 작동하도록 보장할 수 있습니다.