【问题标题】:Multiple versions of 3rd party assembly in asp.net webforms applicationasp.net webforms 应用程序中的 3rd 方程序集的多个版本
【发布时间】:2014-02-11 16:13:23
【问题描述】:

潜伏已久,第一次发帖。

背景:我有一个 asp.net webforms 应用程序,该应用程序当前引用包含各种 Web 控件的第三方程序集。第三方控件有时直接在各个页面上使用,或者是在其他地方使用的用户控件的一部分。该应用程序还利用了自定义服务器控件,这些控件也扩展了各种第三方控件。这些自定义控件也以类似的方式使用。

参考:Related Post,还有几个讨论程序集的多个版本,但我没有发现引用的程序集包含 web 控件。

问题:发现第三方控件之一与 IE10 存在问题。该问题已在最新版本的第三方程序集中得到解决。但是我无法将整个应用程序完全升级到第三方程序集的最新版本。

问题:是否可以同时运行两个版本的第三方程序集?

研究:我采用了其他几篇关于同一程序集的多个版本的帖子中提到的程序集绑定方法:

<dependentAssembly>
<assemblyIdentity name="thirdParty" publicKeyToken="XXX"/>
<codeBase version="OldVersion" href="bin"/>
<codeBase version="NewVersion" href="2013/ThirdParty.dll"/>
</dependentAssembly>
</assemblyBinding>

我还在项目文件中引用了这两个程序集,并为新版本的程序集设置别名:

<Reference Include="ThirdParty, Version=OldVersion, Culture=neutral, PublicKeyToken=XXX, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Library\ThirdParty.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ThirdParty, Version=NewVersion, Culture=neutral, PublicKeyToken=XXX, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>2013\ThirdParty.dll</HintPath>
<Private>False</Private>
<Aliases>newVersion</Aliases>
</Reference>

在我要使用新版本控件的目标用户控件中,我有以下标记:

<%@Assembly Name="ThirdParty,  Version=NewVersion, Culture=neutral, PublicKeyToken=XXX" %>
<%@Register tagPrefix="2013" namespace="ThirdPartyNamespace" Assembly="ThirdParty,  Version=NewVersion, Culture=neutral, PublicKeyToken=XXX"  %>

在设计器代码隐藏中,我有以下内容(newVersion 是分配给上述参考的别名):

extern alias newVersion;

protected newVersion::ThirdParty.ControlName cbRangeType;

一切都构建并运行,直到我到达 asp.net 编译器解析标记的部分。它因 CS0433 错误而失败。这几乎表明 cbRangeType 控件的类型存在于两个不同的地方。

\AppData\Local\Temp\Temporary ASP.NET Files\root\9f04cc99\85cc721e\assembly\dl3\5dc4ef04\77c80123_27b9ce01\ThirdParty.DLL

\WebSites\Site\2013\ThirdParty.dll'

查看生成的代码,发现控件类型不是使用newVersion别名,而是默认的全局别名:

Line 348:        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
Line 349:        private global::ThirdParty.ControlName @__BuildControlcbRangeType() {
Line 350:            global::ThirdParty.ControlName @__ctrl;

我什至可以在用户控制级别覆盖调用 BuildControl() 生成的内容吗?我正在尝试做的事情甚至可能吗?提前致谢。

问候, 菜鸟

【问题讨论】:

    标签: asp.net webforms telerik


    【解决方案1】:

    不,这是不可能的。如果它们只是版本不同但具有相同的标识,则它们不能并排运行。使用较新的。

    【讨论】:

      【解决方案2】:

      我是否甚至可以覆盖调用生成的内容 用户控件级别的 BuildControl()?

      与其说是替代,不如说是替代,需要重新实现整个ASP.NET build provider 以供用户控制。 (在 v4.5 中,它仍然是一个不可扩展的内部密封类迷宫;您可以从 Mono 项目 / ASP.NET vNext 开始!)

      我正在尝试做的事情是否可能?

      在撰写本文时 (v4.5),ASP.NET 构建提供程序(标记代码生成器)不会发出所需的 extern alias declaration + namespace alias qualifier (::) 组合。因此,在 ASP.NET Web 表单中使用多个版本的第 3 方控件仅适用于服务器控件(也称为自定义、Web 或复合控件;不是用户控件与 @ 987654332@ 标记...更多关于区别的详细信息here)。

      商业质量的 ASP.NET 控件通常作为服务器控件实现,the standard technique for using multiple versions of the same assemblyinstantiating them programmatically 时工作正常。但是,不能在 ASP.NET 标记中访问具有来自不同程序集的多个版本的对象 - 所有交互都必须在代码隐藏中。在标记中使用PlaceHolder 并将服务器控件添加到CreateChildControls 中。根据需要通过创建方法/属性包装器来访问控件。

      如果您的示例的第 3 方程序集的新版本包含服务器控件:

      1. 将在 .ascx.designer.cs designer 代码隐藏(extern alias 和成员变量)中进行的手动修改移动到 .ascx.cs 代码隐藏以确保它们不是被覆盖。
      2. 从目标用户控件标记中删除引用第三方程序集的 @Assembly@Register 指令。
      3. 将 PlaceHolder 添加到您希望服务器控件出现的目标用户控件标记中: &lt;asp:PlaceHolder id="phMarkupRangeTypePlaceHolder" runat="server" /&gt;
      4. 将以下内容添加到您的代码隐藏中:
        protected override void CreateChildControls()
        {
        base.CreateChildControls();
        this.cbRangeType = new newVersion::ThirdParty.ControlName();
        this.phMarkupRangeTypePlaceHolder.Controls.Add(this.cbRangeType);
        }
        protected string cbRangeTypeCustomProperty //-ish
        {
        get { return this.cbRangeType.CustomProperty; }
        }

      PS。使用多个版本时的程序集及其依赖项require strong names

      【讨论】:

      • 非常有用!它帮助我在同一页面上加载了两个版本的控件(尽管我几乎放弃了)。唯一的更正 - PlaceHolder 没有 Add 方法。它具有带有 Add 方法的 Controls 集合。因此,要向 PlaceHolder 添加控件,您必须将其称为 this.phMarkupRangeTypePlaceHolder.Controls.Add(this.cbRangeType);
      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2023-04-05
      • 2011-08-09
      相关资源
      最近更新 更多