Динамическая компиляция C#. Права.
От: Аноним  
Дата: 15.09.11 16:48
Оценка:
Ряд частей программного комплекса использует динамическую генерацию кода (параметризованные алгебраические типы, примитивные скрипты из списка простых инструкций и.т.д.) проблема в том, что Microsoft.CSharp.Compiler требует Full thrust доверия. Это вызывает проблемы с запуском у части клиентов. Требуется запуск под админом или выдача полного доверия. Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?
Re: Динамическая компиляция C#. Права.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.11 18:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?


С правами сделать ничего нельзя. Если не для компиляции (скажем сделали веб-сервис компиляции), то хотя бы для загрузки произвольной сборки потребуется FullTrust.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 15.09.11 20:54
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?


A>С правами сделать ничего нельзя. Если не для компиляции (скажем сделали веб-сервис компиляции), то хотя бы для загрузки произвольной сборки потребуется FullTrust.


В Msdn написано другое.

http://msdn.microsoft.com/ru-ru/library/h538bck7.aspx

Уровень доверия сборки, загружаемой с использованием этого метода, совпадает с уровнем доверия вызывающей сборки.


В нашем приложении прекрасно загружаются сборки лежащие в базе или кешированые на диск. Никаких проблем это в отличие от компиляции никогда не вызывало.
Re[3]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 15.09.11 20:58
Оценка:
Кроме того тогда бы ни один орм основанный на генерации проксей бы не работал бы без фуллтраст.
Re[3]: Динамическая компиляция C#. Права.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.11 21:01
Оценка:
Здравствуйте, Sabrian, Вы писали:

S>В Msdn написано другое.

S>http://msdn.microsoft.com/ru-ru/library/h538bck7.aspx
S>
S>Уровень доверия сборки, загружаемой с использованием этого метода, совпадает с уровнем доверия вызывающей сборки.
S>

S>В нашем приложении прекрасно загружаются сборки лежащие в базе или кешированые на диск. Никаких проблем это в отличие от компиляции никогда не вызывало.

Цитата вообще не в тему. В отрывке MSDN говорится что уровень доверия загруженной сборки совпадает с уровнем доверия загржающей сборки. Про права на загружку ничего не сказано.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 15.09.11 21:49
Оценка:
Здравствуйте, adontz, Вы писали:

A>Цитата вообще не в тему. В отрывке MSDN говорится что уровень доверия загруженной сборки совпадает с уровнем доверия загржающей сборки. Про права на загружку ничего не сказано.


Но тогда, если уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки, и при этом уровень доверия загружающей сборки обязан быть fullthrust, то уровень доверия загруженной сборки тоже получается всегда равен fullthrust. Тогда зачем писать про "уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки" так, будто он может быть разным. Про CSharpCodeProvider в MSDN явно написано про фулл траст. В документации к Assembly.Load об этом ни слова. Кроме того, загружаются же без фуллтраст сборки указаныые в референс секции произвольной сборки, а ведь я мог бы их подменить с помощью AssemblyResolve, загрузив получается произвольную сборку и без фуллтраст. И главное. В нашем приложении, как я и писал, загружаются сборки хранимые в базе. Загружаются без фуллтраст, при этом компиляция CSharpCodeProvider там не работает, швыряя SecurityException. Можно спросить, где указано что загрузка сборок требует полного доверия?
Re[5]: Динамическая компиляция C#. Права.
От: Аноним  
Дата: 15.09.11 22:23
Оценка:
Здравствуйте, Sabrian, Вы писали:

S>Но тогда, если уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки, и при этом уровень доверия загружающей сборки обязан быть fullthrust, то уровень доверия загруженной сборки тоже получается всегда равен fullthrust. Тогда зачем писать про "уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки" так, будто он может быть разным.


Капитан подсказывает, что сборка не может загрузить другую сборку или вообще выполнить любой код с более высокими правами. Капитан замечает, что это в любой системе безопасности так, и что, если было бы по-другому, система безопасности не имела бы смысла.
Re[6]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 15.09.11 22:42
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>Капитан подсказывает, что сборка не может загрузить другую сборку или вообще выполнить любой код с более высокими правами. Капитан замечает, что это в любой системе безопасности так, и что, если было бы по-другому, система безопасности не имела бы смысла.


Сборке не назначаются какие-то права заранее. Она загрузится с любыми, просто не сможет сделать то, что не смогла бы сборка её загрузившая. Об этом в мсдн и написано.
Потому и спрашиваю откуда инфа, что для загрузки произвольной сборки непременно нужен фуллтраст, хотя очевидно что это не так. Проблема CSharpCodeProvider скорее всего в его нативности, именно по этой причине и нужен фулл траст. Никто не запрещает создать сборку Reflection.Emit'ом например, ормы/аоп-тулкиты так и поступают. Не нужен для этого фуллтраст. Изначальная проблема принципиально имеет решение, например можно написать свой менеджд-компилятор C#. Но понятно, что это, сильно преуменьшая — трудновыполнимо. Но могут быть решения и проще, возможно asp .net, с которым я не знаком, компилятор немерле и.т.п.
Re[5]: Динамическая компиляция C#. Права.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.09.11 04:54
Оценка:
Здравствуйте, Sabrian, Вы писали:

S>Но тогда, если уровень доверия загруженной сборки совпадает с уровнем доверия загружающей сборки, и при этом уровень доверия загружающей сборки обязан быть fullthrust, то уровень доверия загруженной сборки тоже получается всегда равен fullthrust.


Я говорил про произвольную сборку. Если вы попытаетесь загрузить сборку своего же приложения (находящуюся в каталоге приложения), то для этого какие-то особые права не нужны.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 16.09.11 11:38
Оценка:
Здравствуйте, adontz, Вы писали:

A>Я говорил про произвольную сборку. Если вы попытаетесь загрузить сборку своего же приложения (находящуюся в каталоге приложения), то для этого какие-то особые права не нужны.


Да каталог вообще ни при чем, он может быть любым, его может вообще не существовать. Но ладно, я не хочу больше спорить с вами, все равно мы отошли от собственно темы вопроса.
Re: Динамическая компиляция C#. Права.
От: Jack128  
Дата: 16.09.11 12:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ряд частей программного комплекса использует динамическую генерацию кода (параметризованные алгебраические типы, примитивные скрипты из списка простых инструкций и.т.д.) проблема в том, что Microsoft.CSharp.Compiler требует Full thrust доверия. Это вызывает проблемы с запуском у части клиентов. Требуется запуск под админом или выдача полного доверия. Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?


что именно компилировать то надо? Не являтся ли компиляция именно _C# кода_ способом решения какой то другой задачи?
Re[2]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 16.09.11 14:24
Оценка:
Здравствуйте, 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 язык, который можно откомпилировать динамически. Естественно на него придется переписать эти шаблоны, но это допустимо.
х
Re[3]: Динамическая компиляция C#. Права.
От: Sabrian  
Дата: 16.09.11 14:29
Оценка:
>Реализации операций и методов для всяких илобайт — они по сути обычные cs файлы с <Vector<T>, Matrix<T>,
Читать как: Реализации операций и методов для всяких алгебраических типов
Re[7]: Динамическая компиляция C#. Права.
От: WolfHound  
Дата: 16.09.11 17:36
Оценка:
Здравствуйте, 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 доверия. Это вызывает проблемы с запуском у части клиентов. Требуется запуск под админом или выдача полного доверия. Что можно сделать в данной ситуации. Есть альтернативные способы компиляции?

Попробуйте заюзать моно компилятор. здесь
Тем более он предлагает сервисный доступ к его функциям здесь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.