【问题标题】:Loose xaml referencing versioned assemblies引用版本化程序集的松散 xaml
【发布时间】:2010-09-20 18:36:08
【问题描述】:

我有一个独特的发展情况,想听听别人的意见。

我需要在富客户端应用程序中加载松散的 xaml 文件。 给定的松散 xaml 文件可能具有对当前未加载到内存中的程序集的引用 因此在加载松散的 xaml 之前加载了引用的程序集。松散的 xaml 和绑 程序集存储在不同的后端服务器上,这些后端服务器下载到客户端和 动态加载。

松散的 xaml 和/或程序集是特定于版本的,不幸的是应用程序可以 在从服务器 A 渲染 xaml.v1 与 assembly.v1 之间不会关闭 和 xaml.v1 以及服务器 B 上的 assembly.v2。 两个程序集都使用相同的命名空间声明,因此“旧”程序集仍然可以 为任何给定的松散 xaml 使用“较新”的 xaml。

问题是,如果我加载包含 对 assembly.v2 中“较新”功能的引用。

我显然无法从应用程序域中卸载 assembly.v1,我不确定是否可以 通过编组在不同应用程序域中加载的 xaml 中的引用项。

除了使用不同的命名空间引用之外还有什么想法吗?

【问题讨论】:

    标签: wpf vb.net xaml assemblies


    【解决方案1】:

    我猜您已经在进行动态程序集解析和加载了?如果是这样,那么您可以尝试在 Xaml 中用假程序集名称代替真实程序集名称 - 然后您可以在程序集解析代码中使用它来加载并返回正确的程序集。例如如果您的原始 Xaml 源是:

    xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly"
    

    并且您知道 Xaml 想要 v2 的 MyAssembly,在将其解析为之前替换 Xaml 字符串中的程序集引用:

    xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly.v2"
    

    .. 然后在您的程序集解析/加载代码中,当您看到末尾的“.v2”位时,您会寻找并加载该程序集。

    如果我误解了这个问题,或者您目前没有进行任何自定义程序集解决方案,请告诉我 - 我认为这肯定是这种情况下的关键。

    【讨论】:

      【解决方案2】:

      我还没有确认这是否会起作用,但我相信它可能会。您可以使用 XmlnsDefinitionAttribute(在程序集级别)。例如

      Assembly V1 -> AssemblyInfo.cs

      [assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v1", "MyCompany.MyProject" )]
      

      Assembly V2 -> AssemblyInfo.cs

      [assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v2", "MyCompany.MyProject" )]
      

      然后在 xaml 中:

      xmlns:myassembly="http://schema.mycompany.com/myproject/v2"
      

      【讨论】:

      • 我不确定您是否可以在这里使用不同的命名空间。 “两个程序集都使用相同的命名空间声明,因此对于任何给定的松散 xaml,“旧”程序集仍然可以与“新”程序集一起使用。”
      【解决方案3】:

      另一种选择(假设您正确地对程序集进行版本控制)是在 ns 声明中简单地包含程序集版本,如下所示:

      xmlns:ns0="clr-namespace:MyCompany.MyProject.MyNameSpace; Assembly=MyCompany.MyProject, Version=1.0.0.0"
      

      【讨论】:

      • 当我尝试这个时,它显示“未知的构建错误,”clr-namespace:blah;assembly=assembly.blah, Version=1.3.0.0' 映射 URI 无效。你能提供一个指向 MSDN 参考的链接吗?
      • 对不起,那是我在没有实际尝试的情况下传递信息。我读到msdn.microsoft.com/en-us/library/ms747086.aspx 说 assemble= 之后的部分是 AssemblyName(带有以下链接)(下一条评论)
      • msdn.microsoft.com/en-us/library/… 这里是说“AssemblyName 的显示名称的格式是一个以名称开头的逗号分隔的 Unicode 字符串,如下所示:Name '\0' 所以,我的错。应该先测试一下。我现在才测试,结果和你一样。
      • 我曾经遇到过这个问题,原因是......命名空间前的空格。
      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 2013-11-18
      • 2011-02-07
      • 2010-10-14
      • 2018-09-30
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      相关资源
      最近更新 更多