Ошибка ли в методе TypeFactory.CurrentDomain_AssemblyResolve
От: Александр Костяников  
Дата: 10.02.09 14:52
Оценка: 15 (1)
Проблема, которую хочу описать, вылезает не так часто, поэтому не сразу удалось понять в чем дело.
При десериализации объектов, созданных с помощью BLToolkit, иногда возникает exception:
"Unable to find assembly 'SomeType.TypeBuilder.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'"

В Debug'e удалось выяснить, что когда такое происходит, в метод CurrentDomain_AssemblyResolve(..)
namespace BLToolkit.TypeBuilder
{
    public static class TypeFactory
    {
        ...
        private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            ...

в качестве качестве аргумента, точнее args.Name, прилетает строка вида:
"SomeType.TypeBuilder.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null".

Далее по коду происходит проверка на равенство полного названия типа (для нас это 'SomeType.TypeBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null') и того, что пришло в args.Name.
if (type.FullName == args.Name)
    return type.Assembly;

Результат в этом случае false. Поэтому сборка и не находится.

Для себя я эту проблему решаю так:
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllSuffix = ".dll"
    string assemblyDescription;
    int idxDllSuffix = args.Name.IndexOf(dllSuffix, StringComparison.OrdinalIgnoreCase);

    if (idxDllSuffix > 0)
    {
        assemblyDescription = args.Name.Remove(idxDllSuffix, dllSuffix.Length);
    }
    else
    {
        assemblyDescription = args.Name;
    }
    ...

И далее вместо args.Name использую assemblyDescription.

Теперь сборки прекрасно находятся.

Ваши комментарии...
PS: спасибо за проект
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.