我正在尝试用于.NET的新Spring CodeConfig,但遇到了很多麻烦。
我将NuGet软件包Spring.CodeConfig安装到了现有的.NET 4项目中,但是除了麻烦之外,什么都没有。
当我运行以下代码时,ScanAllAssemblies方法将引发ReflectionTypeLoadException:
var context = new CodeConfigApplicationContext();
context.ScanAllAssemblies();
context.Refresh();
即使没有定义配置类,也会发生这种情况,但是如果创建配置类,也会发生这种情况。
LoaderExceptions属性包含以下消息的单个异常:
无法加载文件或程序集'System,Version = 1.0.3300.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其依赖项之一。无效的指针(来自HRESULT的异常:0x80004003(E_POINTER))
我尝试添加从系统版本1.0.3300.0到版本4.0.0.0(这是我的项目中引用的版本)的程序集重定向,但这不起作用。
我该如何解决这个问题?
根据要求,以下是相关项目的参考:
mscorlib,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
Ploeh.Samples.MenuModel,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
Spring.Aop,版本= 1.3.1.40711,文化=中性,PublicKeyToken = 65e474d141e25e07
Spring.Core,版本= 1.3.1.20711,文化=中性,PublicKeyToken = 65e474d141e25e07
Spring.Core,版本= 1.3.1.40711,文化=中性,PublicKeyToken = 65e474d141e25e07
Spring.Core.Configuration,版本= 1.0.0.4111,文化=中性,PublicKeyToken = 65e474d141e25e07
系统,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
System.Core,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
System.Xml,版本= 4.0.0.0,区域性=中性,PublicKeyToken = b77a5c561934e089
System.Xml.Linq,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
xunit,版本= 1.7.0.1540,文化=中性,PublicKeyToken = 8d05b1bb7a6fdb6c
由于第二个参考是项目参考,因此我还将列出其依赖项:
mscorlib,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
System.Core,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
我的App.config中也有这些绑定重定向-以防万一:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Spring.Core" publicKeyToken="65e474d141e25e07" culture="neutral" />
<bindingRedirect oldVersion="1.3.1.20711" newVersion="1.3.1.40711" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="1.0.3300.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
但是,两者都是试图解决CodeConfig问题。删除它们无济于事...
最佳答案
经过一番调查,我们发现这是4.0 CLR下的ReflectionOnlyLoad API的问题。
CodeConfig程序集扫描在2.0 CLR下工作,但是很明显,尽管.NET 3.5和.NET 4.0之间的ReflectionOnlyLoad API没有明显变化,ReflectionOnlyLoad处理依赖程序集的方式似乎存在行为差异(或更准确地说,是在.NET 4.0下以编程方式解析ReflectionOnlyLoad API的类型)。
Spring.NET团队现在正在研究CodeConfig(1.0.1)的快速更新版本,该版本应正确解决此问题并允许其在.NET 4.0下成功使用。感谢您引起我们的注意!