Проблема, которую хочу описать, вылезает не так часто, поэтому не сразу удалось понять в чем дело.
При десериализации объектов, созданных с помощью 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: спасибо за проект
Здравствуйте, Александр Костяников, Вы писали:
АК>При десериализации объектов, созданных с помощью 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>>
БП>Можно минимальный пример, где это воспроизводится?
Могу предложить такой вариант воспроизведения — попробуйте загрузить сборку следующими способами:
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"