Pergunta

Existem dois arquivos XSL.Um inclui o outro usando um <xsl:include>.O modelo principal decide que os actuais modelos de chamar, dependendo do nó de valores e modelos incluídos contêm regras de transformação.Nada de especial aqui.

Mas incluiu o arquivo tem um bloco de script:

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

Usuário:função escape() é usada mais tarde incluído no modelo.

Agora, eu vou para o VS2008 XSLT depurador.

O principal modelo de chamadas <xsl:apply-templates> e os incluídos modelo executa.E um FileNotFound exceção ocorre, "não foi possível carregar arquivo ou assembly 'MyEscaper, Versão=1.0.0.0, Culture=neutral, PublicKeyToken=nulo' ou uma de suas dependências.O sistema não é possível localizar o arquivo especificado."

Agora, se for apenas para o incluiu o arquivo e executá-lo como se fosse um modelo autônomo, não incluídas em qualquer coisa, tudo funciona.O assembly é encontrado e a função é chamada, mas, obviamente, os resultados não fazem sentido como o modelo projetado para ser uma inclusão.

Então, a pergunta: por que não pode o sistema a encontrar o conjunto quando o modelo está incluído?

Mais informações

A documentação declara que "O caminho do assembly que um nome é resolvido duas vezes - uma vez durante a compilação e uma vez durante a execução." Se eu, intencionalmente, fazer um erro de digitação no caminho, eu mesmo FileNotFound de exceção, mas com formato diferente, onde o sistema diz que não pode encontrar file://C:\Absolute\Path\MyEscaper.dll.No entanto, quando o caminho está correto, a exceção de declarações que ele não conseguia encontrar MyEscaper.dll, versão=blabla, público token=null, e essa exceção ocorre no CompiledStylesheet.dll criado por .Líquida.Eu acredito que o compilado de folha de estilos é contada a convocação da assembleia pelo nome, não pelo href, e desde que não seja na sua pasta temporária, a chamada falhará.

Por quê?Onde e por que não um caminho absoluto traduzido (erradamente) em um parente de um, e como faço para controlar isso?

Foi útil?

Solução

Então.

Por algum motivo, em um cenário caminho para o assembly é resolvido de forma diferente durante a compilação e durante a execução.Porque é assim, eu não tenho idéia.

Apenas dois sã soluções foram encontradas:

  1. Mover todo o código de assembly referenciado no modelo XSL, tornando-o um script incorporado.No caso de pequenas funções auxiliares que, na verdade, é o preferido.Caso contrário,

  2. Assine a referência de assembly com um nome forte, adicione-o GAC, e se referem a ele a partir de modelos usando name, não href.Desta forma, a assembléia será visto da mesma forma que durante a compilação e execução, e será encontrado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top