C# 类型 A 无法转换为类型 B (InvalidCastException)...上下文地狱?

发布于 2024-10-01 02:46:01 字数 1978 浏览 4 评论 0 原文

我的网络应用程序遇到了一个非常不愉快的问题。

该应用程序的设计如下:

  • 根应用程序正在加载 Flex SWF,而该应用程序又会在子应用程序 (MagickECB) 中加载第 3 方 Flex SWF 模块。
  • 两个应用程序都引用 Albums.dll,该 dll 位于 /bin/MagickECB/bin 中,并且两个应用程序在 IIS 中共享相同的应用程序池。

编辑:这是两个项目,根应用程序项目和子应用程序项目。子应用程序项目引用根应用程序项目。

当从根应用程序的 Flex 应用程序加载子应用程序的 Flex 模块时,我们随机收到如下强制转换错误:

获取时出错 相册配置: [A]Albums.LocalizationConfiguration 不能投射到 [B]相册.本地化配置。 A型源自“专辑, 版本=1.0.0.0,文化=中立, 上下文中的 PublicKeyToken=null' 位置处的“默认” 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary 网络平台 文件\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 网络平台 文件\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 中的部分声明如下:(编辑:根应用程序的 web.config)

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

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

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

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

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

I'm having a very unpleasant issue with my webapp.

The app is designed as follow :

  • The root App is loading a Flex SWF, which in turn loads a 3rd party Flex SWF module in a sub app (MagickECB).
  • Both Apps reference Albums.dll, dll found in /bin and /MagickECB/bin and both Apps share the same Application Pool in IIS.

EDIT : That's two projects, the root app project and the subapp project. Subapp project reference root app project.

When loading the sub app's flex module from the root app's flex application, we randomly get a cast error as follow :

There was an error getting
configuration of Photobook:
[A]Albums.LocalizationConfiguration
cannot be cast to
[B]Albums.LocalizationConfiguration.
Type A originates from 'Albums,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null' in the context
'Default' at location
'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary
ASP.NET
Files\magickecb\4414db97\126f5aaf\assembly\dl3\cf281292\4a6ecec8_8a7bcb01\Albums.DLL
'.
Type B originates from 'Albums,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null' in the context
'LoadFrom' at location
'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary
ASP.NET
Files\magickecb\4414db97\126f5aaf\assembly\dl3\017fab88\a91238d1_7977cb01\Albums.dll
'.
at
Albums.LocalizationConfiguration.GetConfig()
at Albums.CGlobal.GetUserLocale(String
userHandle)

Trying to investigate this issue, I found out the GetConfig method causing the cast error returned

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

The section in the Web.config is declared as follow : (EDIT : root app's web.config)

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

My guess would be that the internal code of GetSection tries to load Albums.dll in the "LoadFrom" context and therefore cause a conflict with the original Albums.dll loaded in the /bin path (see context problematics)

I also note that other dlls in /MagickECB/Bin also reference Albums.dll, so I rebuild all projects so that every DLL reference the same version of Albums.dll

Last, if you check the dll full path in Temporary files, the extensions are different (uppercase vs lowercase)..

Any input on how to solve this problem would be greatly appreciated !!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜警司 2024-10-08 02:46:01

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

Temporary ASP.NET Files\magickecb\4414db97\126f5aaf\ assembly\dl3\ cf281292\ 4a6ecec8_8a7bcb01 \Albums.DLL

Temporary ASP.NET Files\magickecb\4414db97\126f5aaf\ assembly\dl3\ 017fab88\a91238d1_7977cb01 \Albums.dll

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

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

Double-check your references, if you compare your two dll locations they are different (extension upper case vs lower case is not an issue):

Temporary ASP.NET Files\magickecb\4414db97\126f5aaf\assembly\dl3\ cf281292\4a6ecec8_8a7bcb01 \Albums.DLL

Temporary ASP.NET Files\magickecb\4414db97\126f5aaf\assembly\dl3\ 017fab88\a91238d1_7977cb01 \Albums.dll

Probably means you're referencing two different files - maybe referencing one as a project and the other directly as a file. Do you have any warnings when you try building your web application regarding references?

EDIT: __AssemblyInfo__.ini file in above folders will give you path from which Albums.dll had been copied.

舞袖。长 2024-10-08 02:46:01

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

Without having a explanation for your issue I would suggest to register the assembly at the GAC and use it from there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文