Usando uma assembléia para a criação de scripts em uma referência modelo XSL
-
20-09-2019 - |
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?
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:
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,
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ãohref
.Desta forma, a assembléia será visto da mesma forma que durante a compilação e execução, e será encontrado.