【问题标题】:C# Type A cannot be casted to Type B ( InvalidCastException)... Context hell?C# Type A 不能转换为 Type B (InvalidCastException)...上下文地狱?
【发布时间】:2011-05-06 14:03:47
【问题描述】:

我的 web 应用遇到了一个非常不愉快的问题。

应用程序设计如下:

  • 根应用正在加载 Flex SWF,而后者又会在子应用 (MagickECB) 中加载第 3 方 Flex SWF 模块。
  • 两个应用程序都引用 Albums.dll,在 /bin/MagickECB/bin 中找到 dll,并且两个应用程序在IIS。

EDIT :这是两个项目,根应用项目和子应用项目。子应用项目参考根应用项目。

当从根应用的弹性应用加载子应用的弹性模块时,我们随机得到一个如下的转换错误:

获取时出错 相册配置: [A]相册.LocalizationConfiguration 不能转换为 [B]专辑。本地化配置。 A型起源于'专辑, 版本=1.0.0.0,文化=中性, PublicKeyToken=null' 在上下文中 '默认'在位置 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET 文件\magickecb\4414db97\126f5aaf\assembly\dl3\cf281292\4a6ecec8_8a7bcb01\Albums.DLL'。 B型起源于'专辑, 版本=1.0.0.0,文化=中性, PublicKeyToken=null' 在上下文中 'LoadFrom' 在位置 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET 文件\magickecb\4414db97\126f5aaf\assembly\dl3\017fab88\a91238d1_7977cb01\Albums.dll'。 在 Albums.LocalizationConfiguration.GetConfig() 在 Albums.CGlobal.GetUserLocale(字符串 用户句柄)

试图调查这个问题,我发现了导致转换错误返回的 GetConfig 方法

return (LocalizationConfiguration)ConfigurationManager.GetSection("Localization/Localization");

Web.config 中的部分声明如下:(EDIT : root app's web.config)

<sectionGroup name="Localization"> 
    <section name="Localization" type="Albums.LocalizationConfigurationHandler, Albums"/>
</sectionGroup>

我的猜测是 GetSection 的内部代码会尝试在“LoadFrom”上下文中加载 Albums.dll,因此会导致与 /bin 路径中加载的原始 Albums.dll 发生冲突 (see context problematics)

我还注意到 /MagickECB/Bin 中的其他 dll 也引用了 Albums.dll,因此我重建了所有项目,以便每个 DLL 引用相同版本的 Albums.dll

最后,如果你检查临时文件中的 dll 完整路径,扩展名是不同的(大写与小写)..

任何有关如何解决此问题的意见将不胜感激!

【问题讨论】:

    标签: c# .net scope load assemblies


    【解决方案1】:

    仔细检查你的引用,如果你比较你的两个 dll 位置,它们是不同的(扩展大写与小写不是问题):

    临时 ASP.NET 文件\magickecb\4414db97\126f5aaf\assembly\dl3\ cf281292\4a6ecec8_8a7bcb01 \Albums.DLL

    临时 ASP.NET 文件\magickecb\4414db97\126f5aaf\assembly\dl3\ 017fab88\a91238d1_7977cb01 \Albums.dll

    可能意味着您引用了两个不同的文件 - 可能将一个作为项目引用,另一个直接作为文件引用。当您尝试构建有关引用的 Web 应用程序时,您是否有任何警告?

    编辑: 以上文件夹中的__AssemblyInfo__.ini 文件将为您提供从中复制 Albums.dll 的路径。

    【讨论】:

    • 编译期间没有警告。我有两个项目,根应用程序项目和子应用程序项目。子应用参考根应用项目。
    • 我在考虑 Albums.dll - 这两个项目是如何引用的?那是你的项目吗?
    • 是的,两个都是我的项目。我通过项目引用在子项目中引用了 Albums.dll(这是根项目的输出)。那是你想知道的吗? (子应用项目bin中没有C/P)
    • 好的,你有没有指出这可能是什么时候发生的?您说的是随机的,但这是否仅在 IIS 重新启动后发生,或者应用程序一段时间未使用,或者在池回收后,应用程序重建......?您也可以尝试将 Albums.LocalizationConfigurationHandler 移动到单独的项目中,并从根项目和子项目中引用它。
    • 有一点让我很困惑,这两个文件 (Album.dll) 都在 magickecb 子应用程序中,所以你必须以某种方式获得它两次 - 参考 + 其他方式 - 仍然试图思考这怎么可能发生。是否调用:return (LocalizationConfiguration)ConfigurationManager.GetSection("Localization/Localization");在根应用或子应用中?
    【解决方案2】:

    如果没有对您的问题进行解释,我建议您在 GAC 注册程序集并从那里使用它。

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 2020-12-20
      • 1970-01-01
      • 2013-01-04
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 2019-07-19
      相关资源
      最近更新 更多