我已经在这里阅读了几个相关的问题,但我仍然无法使我的Unity XML配置正常工作。
这是我的配置文件......
<?xml version="1.0" encoding="utf-8"?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="System.Security" />
<namespace name="System.Security.Cryptography" />
<container name="Default">
<register type="HashAlgorithm" mapTo="SHA256Managed" />
<register type="SymmetricAlgorithm" mapTo="AesCryptoServiceProvider" />
</container>
</unity>
我得到的错误信息是......
无法解析类型名称或别名 AesCryptoServiceProvider 。 请检查您的配置文件并验证此类型名称。
HashAlgorithm正常解析,而不是AES提供商。
我的项目中引用了 System.Security 程序集,如果我这样做,则可以解析 SymmetricAlgorithm 类型...
IUnityContainer Container = new UnityContainer ();
Container.RegisterType<SymmetricAlgorithm, AesCryptoServiceProvider> ();
...但如果可能的话,我希望将配置保留在代码之外。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
问题是AesCryptoServiceProvider
不在System.Security
中。您将在System.Core
程序集中找到它。
因此,您需要修复统一配置以包括该程序集,如下所示:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<namespace name="System.Security.Cryptography" />
<assembly name="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<container name="Default">
<register type="HashAlgorithm" mapTo="SHA256Managed" />
<register type="SymmetricAlgorithm" mapTo="AesCryptoServiceProvider" />
</container>
</unity>
注意:您需要提供程序集的全名(包含版本,文化和令牌)。这是因为Unity只是将名称空间和程序集名称与类型名称连接起来,然后它将检查结果类型是否存在(检查documentation here)。使用其名称加载类型时,大多数情况下您需要完全限定名称,例如,请参阅Type.GetType
中有关类型名称的注释:
要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了