Проблема в TypeFactory.cs / GetAssemblyBuilder
От: denisio_mcp  
Дата: 10.03.11 06:20
Оценка:
После того, как попробовал собрать проект обфускатором — падает на создании класса:

Unhandled Exception: System.AggregateException: One or more errors occurred. ---> BLToolkit.TypeBuilder.TypeBuilderException: Could not build the 'DB.Car.Item'
type. ---> System.ArgumentException: Illegal characters in path.
   at System.IO.Path.CheckInvalidPathChars(String path)
   at System.IO.Path.GetDirectoryName(String path)
   at BLToolkit.TypeBuilder.TypeFactory.GetAssemblyBuilder(Type type, String suffix)
   at BLToolkit.TypeBuilder.TypeFactory.GetType(Object hashKey, Type sourceType, ITypeBuilder typeBuilder)
   --- End of inner exception stack trace ---
   at BLToolkit.TypeBuilder.TypeFactory.GetType(Object hashKey, Type sourceType, ITypeBuilder typeBuilder)
   at BLToolkit.Reflection.TypeAccessor.GetAccessor(Type originalType)
   at BLToolkit.Mapping.ObjectMapper.Init(MappingSchema mappingSchema, Type type)
   at BLToolkit.Mapping.MappingSchema.GetObjectMapper(Type type)
   at BLToolkit.Mapping.MappingSchema.MapDataReaderToList[T](IDataReader reader, IList`1 list, Object[] parameters)
   at BLToolkit.Data.DbManager.ExecuteListInternal[T](IList`1 list, Object[] parameters)
   at BLToolkit.Data.DbManager.ExecuteList[T]()
   at DB.Car.ItemHandler.ByDevice(DBSession session, Int32 IDDEV) in File45:line 114


Окружение: namespace DB.Car и класс Item в нём — живут в DataLayer.dll и есть ещё ехешник, в котором выполняется вся работа.
Если исключить DataLayer.dll из обфускации — всё ок. В открытом виде же отдавать её крайне нежелательно.

Вопрос извечный — чего делать? BLToolkit 4.0.0.996 (в свойствах файла по крайней мере такая). Crypto Obfuscator 2010 R2 trial.
Re: Проблема в TypeFactory.cs / GetAssemblyBuilder
От: BorisKV  
Дата: 25.03.11 22:07
Оценка:
Здравствуйте, denisio_mcp, Вы писали:

_>После того, как попробовал собрать проект обфускатором — падает на создании класса:


...

_>Окружение: namespace DB.Car и класс Item в нём — живут в DataLayer.dll и есть ещё ехешник, в котором выполняется вся работа.

_>Если исключить DataLayer.dll из обфускации — всё ок. В открытом виде же отдавать её крайне нежелательно.

_>Вопрос извечный — чего делать? BLToolkit 4.0.0.996 (в свойствах файла по крайней мере такая). Crypto Obfuscator 2010 R2 trial.


Я бы посоветовал попробовать использовать BLTGen.exe и генерить классы после компиляции, а не в рантайме. Потом попробовать обфускировать DataLayer.dll и DataLayer.BLToolkitExtension.dll и поставлять все это вместе.

В программе в самом начале укажите (ну или через конфигурацию):

TypeFactory.LoadTypes = true


Вообще в BLT очень много завязанно на Reflection и некоторые обфускаторы уж слишком рьяно все перелопачивают и нет никакой гарантии, что BLT будет работать. К примеру есть:

public abstract class Item
{
    public abstract int ItemType { get; set; }
}


доблесный обфускатор превратит это в

public abstract class @#$@#$
{
    public abstract int $%$#%$# { get; set; }
}


Теперь приезжает к вам данные — и маппер пытается замапить найти куда положить ItemType из записи и не находит — так как он не догадывается, что ItemType это тоже самое что и $%$#%$#.

Кстати на самой странице Crypto Obfuscator написанно что они предоставляют "Anti-Reflection protection"...

Борис.
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
Re[2]: Проблема в TypeFactory.cs / GetAssemblyBuilder
От: denisio_mcp  
Дата: 26.03.11 05:06
Оценка:
Здравствуйте, BorisKV, Вы писали:

BKV>В программе в самом начале укажите (ну или через конфигурацию):


BKV>
BKV>TypeFactory.LoadTypes = true
BKV>


Спасибо, попробую.

BKV>
BKV>public abstract class @#$@#$
BKV>{
BKV>    public abstract int $%$#%$# { get; set; }
BKV>}
BKV>

BKV>Теперь приезжает к вам данные — и маппер пытается замапить найти куда положить ItemType из записи и не находит — так как он не догадывается, что ItemType это тоже самое что и $%$#%$#.

У меня для всех полей выставлен атрибут MapField с именем поля.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.