Анонимный тип со средним уровнем доверия, работает с Reflection, а не с выражениями - PullRequest
5 голосов
/ 17 августа 2011

Я делаю пользовательские проекции на запросы Linq в Medium Trust и получаю MethodAccessException или TypeAccessException жалобу на рефлексию и права безопасности.

Я упростил код до следующего:

var anon1 = new { Name = "Bill Gates" };
var ctor = anon1.GetType().GetConstructors().First();

// With native Reflection it works
var anon2 = ctor.Invoke(new object[] { "Steve Ballmer" });

var expr = Expression.New(ctor, Expression.Constant("Scott Guthrie"));
var lamb = Expression.Lambda(expr);      // This throws in Medium Trust

var anon3 = lamb.Compile().DynamicInvoke();

anon1.ToString();        // --> { Name = Bill Gates }
anon2.ToString();        // --> { Name = Steve Ballmer }
anon3.ToString();        // --> { Name = Scott Guthrie }

В режиме полного доверия будут созданы anon2 и anon3.В Medium Trust будет создано только anon2.

Другая аналогичная ситуация не решила проблему

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Это вызвано тем, что анонимные типы создаются компилятором как internal.Это означает, что код вне вашей сборки не сможет получить доступ к типам.Когда вы делаете отражение самостоятельно, все вызовы поступают из вашей сборки, поэтому это разрешено.Но когда вы вводите выражения, вызовы начинают поступать из библиотек DLL и поэтому они останавливаются.

Простой способ решения проблем такого рода - с атрибутом InternalsVisibleTo .Просто добавив это:

[assembly: InternalsVisibleTo("System.Core")]

, вы сможете создать лямбду.Однако, когда вы идете, чтобы скомпилировать его, вы получаете аналогичное разрешение разрешения.В этом случае метод Compile запускает некоторый код в mscorlib.dll, чтобы попытаться получить доступ к вашему типу.Я попытался добавить:

[assembly: InternalsVisibleTo("mscorlib")]

, но это не сработало.Я думаю, что это может быть связано с тем фактом, что mscorlib строго подписан.В соответствии с документацией InternalsVisislbeTo:

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

Возможно, если вашкод был подписан, это будет работать.Или, возможно, вам даже не нужен вызов Compile () - может, это было только для тестирования?Добавление ссылки на System.Core стоит попробовать.

0 голосов
/ 21 октября 2011

Если вы хотите выполнить модульное тестирование, а не продолжать тестирование в браузере, я только недавно опубликовал сообщение о том, как выполнить модульное тестирование кода в Medium Trust

Часть третья имеет загружаемую сборку с базовым классом, который можно использовать для любого тестового устройства NUnit, и содержит ссылки на другие части: http://boxbinary.com/2011/10/how-to-run-a-unit-test-in-medium-trust-with-nunitpart-three-umbraco-framework-testing/

...