Про Assembly.Load и Assembly.LoadFrom
От: DragonFire Россия  
Дата: 12.02.11 09:29
Оценка:
Доброго времени суток всем читателям.
Вот с такой проблемой я столкнулся и никак не могу разобраться как с ней бороться при использовании вышеперечисленных методов загрузки сборок.

Итак, поехали. Есть папка и в ней три сборки:
Сборки зависят друг от друга так:

Сборка Main лежит в зашифрованном виде, поэтому в методе загрузки сборок я пишу такой код:
Byte[] assemblyBytes = CryptoManager.Unpack(AssemblyPath, AssemblyName);
Assembly plugInAssembly = Assembly.Load(assemblyBytes);                
foreach (var refAssembly in plugInAssembly.GetReferencedAssemblies())
{
    Assembly.LoadFrom(AssemblyPath + refAssembly.Name);
}


После этого в списке загруженных модулей появляются следующие записи:
<...>
MainApplication
Main
A
B
<...>


НО при попытке создать класс из Main, который ссылается на класс из A вываливается исключение: сборка A не найдена... Хотя она поидее загружена в домен! Как такое может быть?

Естественно, если написать такой код, вместо предыдущего:
Byte[] assemblyBytes = CryptoManager.Unpack(AssemblyName);
File.WriteAllBytes(AssemblyName + ".pack", assemblyBytes);
Assembly plugInAssembly = Assembly.LoadFrom(AssemblyName + ".pack");

То все заработает. Но мне не хочется сохранять расшифрованную сборку на системном диске...
Re: Про Assembly.Load и Assembly.LoadFrom
От: hardcase Пират http://nemerle.org
Дата: 12.02.11 09:41
Оценка:
Здравствуйте, DragonFire, Вы писали:

DF>НО при попытке создать класс из Main, который ссылается на класс из A вываливается исключение: сборка A не найдена... Хотя она поидее загружена в домен! Как такое может быть?


1) Для отладки таких проблем используйте утиллиту fuslogvw (входит в SDK)
2) Для указания локальных путей поиска сборок используйте privatePath
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Про Assembly.Load и Assembly.LoadFrom
От: hardcase Пират http://nemerle.org
Дата: 12.02.11 09:59
Оценка: +1
Здравствуйте, DragonFire, Вы писали:

DF>НО при попытке создать класс из Main, который ссылается на класс из A вываливается исключение: сборка A не найдена... Хотя она поидее загружена в домен! Как такое может быть?


У вас сборки загрузились в разные контексты, вот и начались проблемы. Использование бинарного образа приводит к тому, что сборка загружается "без контекста". В этом случае все ее зависитмости нужно разруливать вручную — в событии AppDomain.AssemblyResolve.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Про Assembly.Load и Assembly.LoadFrom
От: vf  
Дата: 12.02.11 11:05
Оценка:
Здравствуйте, DragonFire, Вы писали:

DF>Сборка Main лежит в зашифрованном виде


Шифруете для защиты от декомпиляции? А как-то боритесь с тем что, ИМХО, можно относительно легко расшифровать, если заглянуть в программу?

Cпрашиваю, потому что мне идея нравиться, не кажеться достаточно надежной.
Re[2]: Про Assembly.Load и Assembly.LoadFrom
От: DragonFire Россия  
Дата: 14.02.11 11:47
Оценка:
Здравствуйте, vf, Вы писали:

vf>Здравствуйте, DragonFire, Вы писали:


DF>>Сборка Main лежит в зашифрованном виде


vf>Шифруете для защиты от декомпиляции? А как-то боритесь с тем что, ИМХО, можно относительно легко расшифровать, если заглянуть в программу?


vf>Cпрашиваю, потому что мне идея нравиться, не кажеться достаточно надежной.


Да, шифруем =) Активационным ключом на основе серийного номера и некоторых данных с машины пользователя (например ID процессора, но мы его не используем)...
Re[2]: Про Assembly.Load и Assembly.LoadFrom
От: DragonFire Россия  
Дата: 14.02.11 11:48
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, DragonFire, Вы писали:


DF>>НО при попытке создать класс из Main, который ссылается на класс из A вываливается исключение: сборка A не найдена... Хотя она поидее загружена в домен! Как такое может быть?


H>У вас сборки загрузились в разные контексты, вот и начались проблемы. Использование бинарного образа приводит к тому, что сборка загружается "без контекста". В этом случае все ее зависитмости нужно разруливать вручную — в событии AppDomain.AssemblyResolve.


Пытался в домен загрузить текущий — не получается...
Re[3]: Про Assembly.Load и Assembly.LoadFrom
От: Sinix  
Дата: 14.02.11 12:54
Оценка:
Здравствуйте, DragonFire, Вы писали:

DF>Да, шифруем =) Активационным ключом на основе серийного номера и некоторых данных с машины пользователя (например ID процессора, но мы его не используем)...


Боюсь, вот это вас сильно разочарует Поэтому или не заморачивайтесь с уберзащитой, или переходите на обфускаторы с генерацией нативного кода. Правда, там грабли c рефлексией/биндингом/etc будут ещё серьёзнее.
Re: Про Assembly.Load и Assembly.LoadFrom
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 15.02.11 16:17
Оценка:
Здравствуйте, DragonFire, Вы писали:

DF><skipped>

[offtop]
Ох, уж эти доморощенные защиты...
[/offtop]
[КУ] оккупировала армия.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.