문제

두 개의 XSL 파일이 있습니다.하나는 다음을 사용하여 다른 하나를 포함합니다. <xsl:include>.기본 템플릿은 노드 값에 따라 어떤 실제 템플릿을 호출할지 결정하며, 포함된 템플릿에는 실제 변환 규칙이 포함됩니다.여기에는 특별한 것이 없습니다.

그러나 포함된 파일에는 스크립트 블록이 있습니다.

  <msxsl:script language="VB" implements-prefix="user">
    <msxsl:assembly href="C:\Absolute\Path\MyEscaper.dll" />
    <msxsl:using namespace="ZebraEscaper.MyCompany" />
    <![CDATA[
    Public Function escape(s As String) As String
      Return EncodeField(s, True)
    End Function
    ]]>
  </msxsl:script>

user:escape() 함수는 나중에 포함된 템플릿에서 사용됩니다.

이제 VS2008 XSLT 디버거로 이동합니다.

기본 템플릿 호출 <xsl:apply-templates> 포함된 템플릿이 실행됩니다.그리고 FileNotFound 예외가 발생합니다. "파일 또는 어셈블리 'MyEscaper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 또는 해당 종속성 중 하나를 로드할 수 없습니다.시스템이 지정된 파일을 찾을 수 없습니다."

이제 포함된 파일로 이동하여 마치 아무것도 포함되지 않은 독립형 템플릿인 것처럼 실행하면 모든 것이 작동합니다.어셈블리가 발견되고 함수가 호출되지만 템플릿이 포함되도록 설계된 결과는 분명히 의미가 없습니다.

그렇다면 질문은 - 템플릿이 포함되어 있는데 시스템이 어셈블리를 찾을 수 없는 이유는 무엇입니까?

추가 정보

문서에 따르면 "어셈블리 경로 이름은 편집 중에 한 번, 실행 중에 한 번은 두 번 해결됩니다." 의도적으로 경로에서 오타를 만들면 동일한 filenotfound 예외를 얻지 만 시스템에서 찾을 수 없다고 말하는 곳에 다르게 포맷됩니다. 파일://C:\Absolute\Path\MyEscaper.dll.그러나 경로가 올바른 경우 예외를 찾을 수 없다고 주장합니다. MyEscaper.dll, 버전=blabla, 공개 토큰=null, 해당 예외는 .Net에서 생성된 CompiledStylesheet.dll에서 발생합니다.나는 컴파일된 스타일시트가 href가 아닌 이름으로 어셈블리를 호출하라는 지시를 받았고 임시 폴더에 없기 때문에 호출이 실패했다고 믿습니다.

왜 그렇습니까?절대 경로가 상대 경로로 (잘못) 변환되는 위치와 이유는 무엇이며 어떻게 제어합니까?

도움이 되었습니까?

해결책

그래서.

어떤 이유로 포함된 시나리오에서는 어셈블리에 대한 경로가 컴파일 및 실행 중에 다르게 확인됩니다.왜 그런지, 나는 단서가 없습니다.

두 가지 정상적인 솔루션만 발견되었습니다.

  1. 참조된 어셈블리의 모든 코드를 XSL 템플릿으로 이동하여 포함된 스크립트로 만듭니다.실제로 선호되는 작은 도우미 기능의 경우.그렇지 않으면,

  2. 강력한 이름으로 참조된 어셈블리에 서명하고 이를 GAC에 추가한 다음 다음을 사용하여 템플릿에서 참조합니다. name, 아니다 href.이렇게 하면 컴파일 및 실행 중에 어셈블리가 동일한 방식으로 조회되어 발견됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top