3

有两个 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 异常,但格式不同,系统说它找不到file://C:\Absolute\Path\MyEscaper.dll。但是,当路径正确时,该异常声称它找不到MyEscaper.dll, version=blabla, public token=null,并且该异常发生在由 .Net 创建的 CompiledStylesheet.dll 中。我相信已编译的样式表被告知按名称而不是 href 调用程序集,并且由于它不在其临时文件夹中,因此调用失败。

为什么这样?绝对路径在哪里以及为什么会(错误地)转换为相对路径,我该如何控制它?

4

1 回答 1

3

所以。

由于某种原因,在包含的场景中,程序集的路径在编译期间和执行期间的解析方式不同。为什么会这样,我没有头绪。

只找到了两个理智的解决方案:

  1. 将所有代码从引用的程序集中移到 XSL 模板中,使其成为嵌入式脚本。在实际首选的小型辅助函数的情况下。否则,

  2. 使用强名称对引用的程序集进行签名,将其添加到 GAC,然后使用name,而不是从模板中引用它href。这样程序集在编译和执行过程中会以同样的方式被查找,并且会被找到。

于 2010-01-21T12:20:03.043 回答