-
서버의 제한된 성능으로 인해 Castle + Nhibernate를 사용했기 때문에 웹사이트 업데이트 후 서버의 재컴파일 과정이 특히 오래 걸리고, 게시된 웹 프로그램도 컴파일하는데도 때로는 1분 이상 걸리는 경우가 있었습니다. 다음은 웹에서 사용되는 동적 라이브러리입니다.
Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facilities.AutomaticTransactionManagement.dll
Castle.Facilities.NHibernateIntegration.dll
Castle.MicroKernel.dll
Castle.Services.Transaction.dll
Castle.Windsor.dll
FredCK.FCKeditorV2.dll
Iesi.Collections.dll
log4net.dll
MySql.Data.dll/System.Data.SQLite.dll
NHibernate.dll
UrlRewritingNet.UrlRewriter.dll
내 웹 프로젝트가 업데이트되고 재컴파일 후 생성된 web.dll이 서버에 업로드될 때마다 서버 w3p가 다시 시작되고 내 웹 디렉토리의 파일이 csc됩니다. 전체 프로세스는 정말 길고 견딜 수 없습니다.
[좋은 제안이 있으신지 궁금합니다]
나중에 위의 동적 라이브러리를 GAC에 넣으면 다시 시작하는 데 필요한 시간이 줄어들지 않을까 생각했습니다(실습을 통해 뚜렷한 변화가 없음이 입증되었습니다).
이 글은 원래의 문제를 해결한 것은 아니지만 asp.net에서 GAC에 저장된 타사 동적 라이브러리를 참조하는 문제가 포함되어 있기 때문에 그대로 기록했습니다(:-). 이것이 이 글의 초점입니다).
위의 모든 동적 라이브러리는 서명되었으며 이를 GAC에 넣는 프로세스는 다음과 같습니다.
1. 타사 동적 라이브러리를 GAC에 등록
gacutil -i Castle.Core.dll
gacutil -i Castle.DynamicProxy2.dll
gacutil -i Castle.Facilities.AutomaticTransactionManagement.dll
gacutil -i Castle.Facilities.NHibernateIntegration.dll
gacutil -i Castle.MicroKernel.dll
gacutil -i Castle.Services.Transaction.dll
gacutil -i Castle.Windsor.dll
gacutil -i FredCK.FCKeditorV2.dll
gacutil -i Iesi.Collections.dll
gacutil -i Intelligencia.UrlRewriter.dll
gacutil -i log4net.dll
gacutil -i MySql.Data.dll
gacutil -i NHibernate.dll
gacutil -i System.Data.SQLite.dll
gacutil -i UrlRewritingNet.UrlRewriter.dll
이 프로세스는 비교적 쉽습니다. gacutil은 .net 프레임워크 SDK(재배포 패키지)에서 찾을 수 있습니다.
2. 웹 프로젝트가 타사 동적 라이브러리를 참조하는 방법을 재정의합니다. GAC를 직접 참조합니다.
여기서 발생하는 또 다른 문제는 다음 설정을 지정하지 않으면 vs2005가 GAC에 정의된 타사 동적 라이브러리를 참조할 수 없다는 것입니다.
정의한 타사 동적 라이브러리가 c:3rdlibs에 저장되어 있다고 가정합니다.
레지스트리 수정: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
이 프로젝트 아래에 항목을 추가하고 c:3rhlibs를 가리킵니다.
이제 웹 프로젝트에서 타사 GAC 라이브러리를 참조할 수 있습니다.
3. 웹을 다시 컴파일하고 디버그합니다.
첫 번째 문제: 구성 오류
일반 사본을 클립보드 인쇄로 보시겠습니까?
구성 오류
설명: 이 요청을 서비스하는 데 필요한 구성 파일을 처리하는 동안 오류가 발생했습니다. 아래의 구체적인 오류 내용을 확인하신 후 구성 파일을 적절하게 수정하시기 바랍니다.
파서 오류 메시지: 파일이나 어셈블리 'UrlRewritingNet.UrlRewriter' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다. (web.config 라인 50)
소스 오류:
48행:
49행: <httpModules>
50행: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
소스 파일: web.config 줄: 50
구성 오류 설명: 이 요청을 처리하는 데 필요한 구성 파일을 처리하는 동안 오류가 발생했습니다. 아래의 구체적인 오류 내용을 확인하신 후 구성 파일을 적절하게 수정하시기 바랍니다.
파서 오류 메시지: 파일이나 어셈블리 'UrlRewritingNet.UrlRewriter' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다. (web.config 라인 50)
소스 오류:
48행:
49행: <httpModules>
50행: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
소스 파일: web.config 줄: 50
분명히 우리 웹 프로젝트는 GAC에 이미 저장된 라이브러리를 찾지 못했습니다. GAC에 넣기 전에 이러한 라이브러리는 컴파일되어 web/bin 디렉토리에 출력됩니다. 이제 자동으로 찾을 수 없으므로 web.config를 수정하여 라이브러리 참조 방법을 지정할 수 있습니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
<구성>
...
<런타임>
<assembliesBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly 부분 이름="log4net" fullName="log4net, 버전=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly 부분 이름="Castle.Windsor" fullName="Castle.Windsor, 버전=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly 부분 이름="Castle.MicroKernel" fullName="Castle.MicroKernel, 버전=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</어셈블리바인딩>
</런타임>
</구성>
<구성>
...
<런타임>
<assembliesBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly 부분 이름="log4net" fullName="log4net, 버전=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly 부분 이름="Castle.Windsor" fullName="Castle.Windsor, 버전=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly 부분 이름="Castle.MicroKernel" fullName="Castle.MicroKernel, 버전=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</어셈블리바인딩>
</런타임>
</구성>
컴파일, 디버그 및 다시 실행
두 번째 오류: 컴파일 오류
일반 사본을 클립보드 인쇄로 보시겠습니까?
'/' 응용 프로그램에 서버 오류가 있습니다.
------------------------------------- ----------------------------------
컴파일 오류
설명: 이 요청을 처리하는 데 필요한 자원을 컴파일하는 동안 오류가 발생했습니다. 다음의 구체적인 오류 내용을 확인하신 후 소스코드를 적절하게 수정하시기 바랍니다.
컴파일러 오류 메시지: CS0012: 'Castle.Windsor.IContainerAccessor' 유형이 참조되지 않은 어셈블리에 정의되어 있습니다. "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" 어셈블리에 대한 참조를 추가해야 합니다.
소스 오류:
[해당 소스 라인 없음]
소스 파일: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 줄: 133
'/' 응용 프로그램에 서버 오류가 있습니다.
------------------------------------- ----------------------------------
컴파일 오류 설명: 이 요청을 처리하는 데 필요한 리소스를 컴파일하는 동안 오류가 발생했습니다. 다음의 구체적인 오류 내용을 확인하신 후 소스코드를 적절하게 수정하시기 바랍니다.
컴파일러 오류 메시지: CS0012: 'Castle.Windsor.IContainerAccessor' 유형이 참조되지 않은 어셈블리에 정의되어 있습니다. "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" 어셈블리에 대한 참조를 추가해야 합니다.
소스 오류:
[해당 소스 라인 없음]
소스 파일: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 줄: 133
이번에는 컴파일 오류인데 오류 메시지가 명확하지 않고 당분간 특정 내용을 찾을 수 없습니다. web.config를 수정하고 다음과 같이 구성 섹션(컴파일)을 추가합니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
<구성>
<시스템.웹>
... ...
<컴파일 디버그="true" />
... ...
</system.web>
</구성>
<구성>
<시스템.웹>
... ...
<컴파일 디버그="true" />
... ...
</system.web>
</구성>
다시 디버깅 중:
일반 사본을 클립보드 인쇄로 보시겠습니까?
컴파일 오류
설명: 이 요청을 처리하는 데 필요한 자원을 컴파일하는 동안 오류가 발생했습니다. 다음의 구체적인 오류 내용을 확인하신 후 소스코드를 적절하게 수정하시기 바랍니다.
컴파일러 오류 메시지: CS0012: 'Castle.Windsor.IContainerAccessor' 유형이 참조되지 않은 어셈블리에 정의되어 있습니다. "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" 어셈블리에 대한 참조를 추가해야 합니다.
소스 오류:
134행: }
135행:
136행: 보호된 ASP.global_asax ApplicationInstance {
137행: {를 얻습니다.
138행: return ((ASP.global_asax)(this.Context.ApplicationInstance));
소스 파일: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 줄: 136
컴파일 오류 설명: 이 요청을 처리하는 데 필요한 리소스를 컴파일하는 동안 오류가 발생했습니다. 다음의 구체적인 오류 내용을 확인하신 후 소스코드를 적절하게 수정하시기 바랍니다.
컴파일러 오류 메시지: CS0012: 'Castle.Windsor.IContainerAccessor' 유형이 참조되지 않은 어셈블리에 정의되어 있습니다. "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" 어셈블리에 대한 참조를 추가해야 합니다.
소스 오류:
134행: }
135행:
136행: 보호된 ASP.global_asax ApplicationInstance {
137행: get {
138행: return ((ASP.global_asax)(this.Context.ApplicationInstance));
소스 파일: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 줄: 136
이 오류 메시지는 가장 중요합니다.
컴파일러 오류 메시지: CS0012: 'Castle.Windsor.IContainerAccessor' 유형이 참조되지 않은 어셈블리에 정의되어 있습니다. "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" 어셈블리에 대한 참조를 추가해야 합니다.
분명히 web.config를 수정한 후 iis 서비스는 현재 웹 프로젝트를 다시 시작하고 컴파일해야 합니다. 초기화된 변수 중 하나는 정적 변수일 수도 있습니다. Windsor를 호출했는데 csc가 이 Castle.Windsor를 찾을 수 없어 정말 번거로운 과정입니다.
첫 번째 시도: 웹 프로젝트의 참조 섹션에서 Castle.Windsor를 설정합니다. 원래 동적 라이브러리를 직접 참조할 때 GAC 참조 후 이 출력이 취소되었습니다. . "로컬에 복사"로 설정합니다. 물론 설정 후 컴파일은 Castle.Windsor 파일을 web/bin으로 출력합니다. 이러한 방식으로 이 동적 라이브러리를 찾았으므로 디버깅도 통과할 수 있습니다.
그러나 이것이 의심을 덜어주지는 않습니다. 즉, <runtime><assemblyBinding>... ...</assembleBinding><runtime>에 정의된 Assembly는 컴파일 프로세스에 영향을 주지 않으므로 컴파일 프로세스 중에 사용해야 합니다. 어느 섹션인가요?
두 번째 시도: 첫 번째 시도에서 (컴파일) 섹션을 생각하고 msdn 설명을 확인한 후 <컴파일>에 <어셈블리> 정의가 있는지 확인하고 다음과 같이 구성을 추가합니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
<컴파일 디버그="false">
<어셈블리>
<추가 어셈블리="Castle.Windsor, 버전=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</어셈블리>
</컴파일>
<컴파일 디버그="false">
<어셈블리>
<추가 어셈블리="Castle.Windsor, 버전=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</어셈블리>
</컴파일>
그런 다음 웹 프로젝트에서 Castle.Windsor에 대한 "로컬에 복사"를 취소하고 다시 컴파일하고 실행합니다.
모두 잘 작동합니다.
이 시점에서 우리는 제3자가 참조하는 모든 동적 라이브러리를 GAC에 성공적으로 넣었습니다.