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

时间:2010-11-08 10:00:02

标签: c# .net scope load assemblies

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

该应用程序的设计如下:
- 根应用程序正在加载Flex SWF,后者又在子应用程序中加载第三方Flex SWF模块( MagickECB )。 - 两个应用程序都引用 / Albases.dll ,在 / bin / MagickECB / bin 中找到dll,两个应用程序在IIS中共享相同的应用程序池。

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

从根应用程序的flex应用程序加载子应用程序的flex模块时,我们会随机获得一个强制转换错误,如下所示:

  

收到错误   Photobook的配置:   [A] Albums.LocalizationConfiguration   无法施展   [B] Albums.LocalizationConfiguration。   A型来自'专辑,   版本= 1.0.0.0,文化=中立,   上下文中的PublicKeyToken = null'   位置处的“默认”   “的 C:\ Windows \ Microsoft.NET \框架\ V2.0.50727 \临时   ASP.NET   文件\ magickecb \ 4414db97 \ 126f5aaf \组件\ DL3 \ cf281292 \ 4a6ecec8_8a7bcb01 \ Albums.DLL ”。   B型来自'专辑,   版本= 1.0.0.0,文化=中立,   上下文中的PublicKeyToken = null'   位置处的“ LoadFrom ”   “的 C:\ Windows \ Microsoft.NET \框架\ V2.0.50727 \临时   ASP.NET   文件\ magickecb \ 4414db97 \ 126f5aaf \组件\ DL3 \ 017fab88 \ a91238d1_7977cb01 \ Albums.dll ”。   在   Albums.LocalizationConfiguration.GetConfig()   在Albums.CGlobal.GetUserLocale(String   userHandle)

尝试调查此问题,我发现GetConfig方法导致返回强制转换错误

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

Web.config中的部分声明如下:(编辑:root app的web.config)

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

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

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

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

非常感谢有关如何解决此问题的任何意见!!

2 个答案:

答案 0 :(得分:10)

仔细检查您的参考文献,如果您比较两个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的路径。

答案 1 :(得分:0)

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