Ошибка ли в методе 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: спасибо за проект
Re: Ошибка ли в методе TypeFactory.CurrentDomain_AssemblyRes
От: Блудов Павел Россия  
Дата: 11.02.09 01:52
Оценка:
Здравствуйте, Александр Костяников, Вы писали:

АК>При десериализации объектов, созданных с помощью BLToolkit, иногда возникает exception:

АК>"Unable to find assembly 'SomeType.TypeBuilder.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'"
Это действительно проблема.
Проблема именно в суффиксе .dll, которго быть не должно. Можно минимальный пример, где это воспроизводится?
... << RSDN@Home 1.2.0 alpha 4 rev. 1136>>
Re[2]: Ошибка ли в методе TypeFactory.CurrentDomain_Assembly
От: Аноним  
Дата: 11.02.09 07:43
Оценка:
БП>Можно минимальный пример, где это воспроизводится?

Могу предложить такой вариант воспроизведения — попробуйте загрузить сборку следующими способами:



static int Main(string[] args)
{
    // В этом случае в CurrentDomain_AssemblyResolve придет как раз то, что просили загрузить - TestAssembly.dll
    try
    {
        Assembly asm = Assembly.Load("TestAssembly.dll, , Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
    }
    catch (Exception exc)
    {
    }
    // В этом случае придет то, что и ожидалось.
    try
    {
        Assembly asm = Assembly.Load(new AssemblyName("TestAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"));
    }
    catch (Exception exc)
    {
    }
}


А вообще код, вызов которого приводит к подобной проблеме привожу ниже, но оговорюсь, практически всегда все подгружается нормально, и только иногда случается такая неприятность:
object obj;
BinaryFormatter formatter = new BinaryFormatter();
obj = formatter.Deserialize(stream); // <- вот этот вызов пытается пытается подгрузить "SomeType.TypeBuilder.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
Re: Ошибка ли в методе TypeFactory.CurrentDomain_AssemblyRes
От: IT Россия linq2db.com
Дата: 13.02.09 06:08
Оценка:
Здравствуйте, Александр Костяников, Вы писали:

АК>Проблема, которую хочу описать, вылезает не так часто, поэтому не сразу удалось понять в чем дело.


Патчик прилепил, по идее должно работать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Ошибка ли в методе TypeFactory.CurrentDomain_Assembly
От: Александр Костяников  
Дата: 13.02.09 12:18
Оценка:
благодарю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.