有两个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: template ()函数稍后将在包含的模板中使用。
现在,我转到VS2008 XSLT调试器。
主模板调用<xsl:apply-templates>,并执行包含的模板。出现FileNotFound异常,“无法加载文件或程序集'MyEscaper、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null‘或其依赖项之一。系统找不到指定的文件。”
现在,如果我只访问包含的文件并像执行独立模板一样执行它,而不是包含在任何东西中,那么一切都会正常工作。程序集被找到,函数被调用,但是显然,作为设计为包含的模板,结果是没有意义的。
那么这个问题--为什么当模板被包含时,系统无法找到程序集?
更多信息
文档指出,“程序集路径名解析了两次--一次在编译期间,一次在执行期间。”如果我故意在路径中输入错误,我会得到相同的file://C:\Absolute\Path\MyEscaper.dll.异常,但是格式化不同,系统表示找不到FileNotFound。但是,当路径正确时,异常声称它找不到MyEscaper.dll、version=blabla、public token=null,该异常发生在.Net创建的CompiledStylesheet.dll中。我相信编译后的样式表被告知按名称调用程序集,而不是按href调用,而且由于它不在其临时文件夹中,调用失败。
为什么会这样呢?一条绝对路径在哪里,为什么会被翻译成相对路径,我如何控制它?
发布于 2010-01-21 12:20:03
所以。
由于某些原因,在包含的场景中,程序集的路径在编译和执行期间被不同地解析。为什么会这样,我一点也不知道。
只找到了两种理智的解决办法:
name而不是href从模板中引用它。这样,在编译和执行过程中将以相同的方式查找程序集,并将找到.。
https://stackoverflow.com/questions/2073577
复制相似问题