代码之家  ›  专栏  ›  技术社区  ›  GSerg

在引用的XSL模板中使用程序集编写脚本

  •  3
  • GSerg  · 技术社区  · 15 年前

    有两个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,version=blabla,public token=空 ,并且该异常发生在.NET创建的compiledStylesheet.dll中。我相信已编译的样式表被要求按名称而不是按href调用程序集,而且由于它不在其临时文件夹中,调用失败。

    为什么呢?绝对路径在哪里被翻译(错误地)成相对路径?我如何控制它?

    1 回复  |  直到 8 年前
        1
  •  3
  •   GSerg    14 年前

    所以。

    出于某种原因,在包含的场景中,在编译和执行期间对程序集的路径进行不同的解析。为什么会这样,我一点也不知道。

    只找到两个健全的解决方案:

    1. 将引用程序集中的所有代码移到XSL模板中,使其成为嵌入脚本。对于实际首选的小助手函数。否则,

    2. 用强名称对引用的程序集签名,将其添加到GAC,并使用从模板引用它 name 不是 href . 这样,在编译和执行期间将以相同的方式查找程序集,并找到它。