Ряд частей программного комплекса использует динамическую генерацию кода (параметризованные алгебраические типы, примитивные скрипты из списка простых инструкций и.т.д.) проблема в том, что Microsoft.CSharp.Compiler требует Full thrust доверия. Это вызывает проблемы с запуском у части клиентов. Требуется запуск под админом или выдача полного доверия. Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?
Здравствуйте, Аноним, Вы писали:
А>Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?
С правами сделать ничего нельзя. Если не для компиляции (скажем сделали веб-сервис компиляции), то хотя бы для загрузки произвольной сборки потребуется FullTrust.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?
A>С правами сделать ничего нельзя. Если не для компиляции (скажем сделали веб-сервис компиляции), то хотя бы для загрузки произвольной сборки потребуется FullTrust.
Уровень доверия сборки, загружаемой с использованием этого метода, совпадает с уровнем доверия вызывающей сборки.
В нашем приложении прекрасно загружаются сборки лежащие в базе или кешированые на диск. Никаких проблем это в отличие от компиляции никогда не вызывало.
S>Уровень доверия сборки, загружаемой с использованием этого метода, совпадает с уровнем доверия вызывающей сборки.
S>
S>В нашем приложении прекрасно загружаются сборки лежащие в базе или кешированые на диск. Никаких проблем это в отличие от компиляции никогда не вызывало.
Цитата вообще не в тему. В отрывке MSDN говорится что уровень доверия загруженной сборки совпадает с уровнем доверия загржающей сборки. Про права на загружку ничего не сказано.
Здравствуйте, adontz, Вы писали:
A>Цитата вообще не в тему. В отрывке MSDN говорится что уровень доверия загруженной сборки совпадает с уровнем доверия загржающей сборки. Про права на загружку ничего не сказано.
Но тогда, если уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки, и при этом уровень доверия загружающей сборки обязан быть fullthrust, то уровень доверия загруженной сборки тоже получается всегда равен fullthrust. Тогда зачем писать про "уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки" так, будто он может быть разным. Про CSharpCodeProvider в MSDN явно написано про фулл траст. В документации к Assembly.Load об этом ни слова. Кроме того, загружаются же без фуллтраст сборки указаныые в референс секции произвольной сборки, а ведь я мог бы их подменить с помощью AssemblyResolve, загрузив получается произвольную сборку и без фуллтраст. И главное. В нашем приложении, как я и писал, загружаются сборки хранимые в базе. Загружаются без фуллтраст, при этом компиляция CSharpCodeProvider там не работает, швыряя SecurityException. Можно спросить, где указано что загрузка сборок требует полного доверия?
Re[5]: Динамическая компиляция C#. Права.
От:
Аноним
Дата:
15.09.11 22:23
Оценка:
Здравствуйте, Sabrian, Вы писали:
S>Но тогда, если уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки, и при этом уровень доверия загружающей сборки обязан быть fullthrust, то уровень доверия загруженной сборки тоже получается всегда равен fullthrust. Тогда зачем писать про "уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки" так, будто он может быть разным.
Капитан подсказывает, что сборка не может загрузить другую сборку или вообще выполнить любой код с более высокими правами. Капитан замечает, что это в любой системе безопасности так, и что, если было бы по-другому, система безопасности не имела бы смысла.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Sabrian, Вы писали:
А>Капитан подсказывает, что сборка не может загрузить другую сборку или вообще выполнить любой код с более высокими правами. Капитан замечает, что это в любой системе безопасности так, и что, если было бы по-другому, система безопасности не имела бы смысла.
Сборке не назначаются какие-то права заранее. Она загрузится с любыми, просто не сможет сделать то, что не смогла бы сборка её загрузившая. Об этом в мсдн и написано.
Потому и спрашиваю откуда инфа, что для загрузки произвольной сборки непременно нужен фуллтраст, хотя очевидно что это не так. Проблема CSharpCodeProvider скорее всего в его нативности, именно по этой причине и нужен фулл траст. Никто не запрещает создать сборку Reflection.Emit'ом например, ормы/аоп-тулкиты так и поступают. Не нужен для этого фуллтраст. Изначальная проблема принципиально имеет решение, например можно написать свой менеджд-компилятор C#. Но понятно, что это, сильно преуменьшая — трудновыполнимо. Но могут быть решения и проще, возможно asp .net, с которым я не знаком, компилятор немерле и.т.п.
Здравствуйте, Sabrian, Вы писали:
S>Но тогда, если уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки, и при этом уровень доверия загружающей сборки обязан быть fullthrust, то уровень доверия загруженной сборки тоже получается всегда равен fullthrust.
Я говорил про произвольную сборку. Если вы попытаетесь загрузить сборку своего же приложения (находящуюся в каталоге приложения), то для этого какие-то особые права не нужны.
Здравствуйте, adontz, Вы писали:
A>Я говорил про произвольную сборку. Если вы попытаетесь загрузить сборку своего же приложения (находящуюся в каталоге приложения), то для этого какие-то особые права не нужны.
Да каталог вообще ни при чем, он может быть любым, его может вообще не существовать. Но ладно, я не хочу больше спорить с вами, все равно мы отошли от собственно темы вопроса.
Здравствуйте, Аноним, Вы писали:
А>Ряд частей программного комплекса использует динамическую генерацию кода (параметризованные алгебраические типы, примитивные скрипты из списка простых инструкций и.т.д.) проблема в том, что Microsoft.CSharp.Compiler требует Full thrust доверия. Это вызывает проблемы с запуском у части клиентов. Требуется запуск под админом или выдача полного доверия. Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?
что именно компилировать то надо? Не являтся ли компиляция именно _C# кода_ способом решения какой то другой задачи?
Здравствуйте, Jack128, Вы писали:
J>что именно компилировать то надо? Не являтся ли компиляция именно _C# кода_ способом решения какой то другой задачи?
Две основные вещи:
1. Самописный ORM. Генерит реалицации абстрактных классов сущностей. Т.е. из
public abstract class User: DataObject
{
[DbKeyField()]
[DbField("id")]
public abstract int ID { get; }
[DbField("name")]
public abstract string Name { get; set; }
[DbField("login")]
public abstract string Login { get; set; }
[DbField("pwd")]
public abstract string PwdHash { get; set; }
}
создает конкретную реализацию класса-сущности. Сменить орм предлагать не нужно. Он написан еще во времена первого дотнета и на него завязана чертова тонна кода, практически весь. В классах-реализациях генерится куча кода (связи один ко многим, мульти ключи, констреинты, генерация sql для insert/update/delete в базу, всякие Equals, GetHashCode и.т.д.) эмитом я его замучаюсь создавать.
2. Алгебраические типы.
Реализации операций и методов для всяких илобайт — они по сути обычные cs файлы с <Vector<T>, Matrix<T>, LinearSystem<T>, Simplex<T> и.т.д. Т.е. эти типы используют динамическую генерацию, для работы с любым типом будь то float или BigInteger. По сути там просто исходники в которых токен <#TYPE#> подменяется на необходимый тип T, все это компилится и подсовывается в качестве некоего, например, VectorMethods<T> типу Vector<T>. По сути динамическая реализация обычных плюсовых шаблонов. Эмитом вообще без вариантов, размер шаблонов несколько сотен килобайт. Они по сути обычные .cs исходники с <#TYPE#> вместо некоего типа.
Это основное, есть еще по мелочи, но там можно обойтись и без компилятора, но нет смысла пока эти две вещи от него зависят. Именно C# использвать особой причины нет. Можно любой .net язык, который можно откомпилировать динамически. Естественно на него придется переписать эти шаблоны, но это допустимо.
>Реализации операций и методов для всяких илобайт — они по сути обычные cs файлы с <Vector<T>, Matrix<T>,
Читать как: Реализации операций и методов для всяких алгебраических типов
Здравствуйте, Sabrian, Вы писали:
S>компилятор немерле и.т.п.
Компилятор немерле умеет компилировать C#.
У него есть небольшой немерловый акцент, но вряд ли вы на него нарветесь.
Если есть желание попробовать, то лучше создать тему в соответствующем форуме.
Работает ли компилятор немерла без Full thrust я честно говоря не знаю.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Динамическая компиляция C#. Права.
От:
Аноним
Дата:
17.09.11 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Ряд частей программного комплекса использует динамическую генерацию кода (параметризованные алгебраические типы, примитивные скрипты из списка простых инструкций и.т.д.) проблема в том, что Microsoft.CSharp.Compiler требует Full thrust доверия. Это вызывает проблемы с запуском у части клиентов. Требуется запуск под админом или выдача полного доверия. Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?
Попробуйте заюзать моно компилятор. здесь
Тем более он предлагает сервисный доступ к его функциям здесь