LinkDemand проверяет сбой при использовании отражения - «Эта сборка не допускает частично доверенных вызывающих». - PullRequest
1 голос
/ 28 мая 2011

Я сталкиваюсь с проблемой, когда вызовы, сделанные из сборки GAC с атрибутом AllowPartiallyTrustedCallers, в другую сборку GAC без , что атрибут, выполненный в среде с частичным доверием, завершается успешно, если выполняется напрямую,но потерпеть неудачу, если сделано с помощью отражения.

Используемые сборки:

  • AssemblyA (установлен в GAC, не не имеет AllowPartiallyTrustedCallers, не может быть изменено)
  • AssemblyB (установлен в GAC, имеет имеет AllowPartiallyTrustedCallers, не может быть изменен)
  • AssemblyC (установлен в GAC, имеет имеет AllowPartiallyTrustedCallers, может быть изменено)
  • AssemblyD (подписано, но не установлено в GAC, имеет , имеет AllowPartiallyTrustedCallers, может быть изменено).

Мне нужно вызывать код в AssemblyA из AssemblyD как напрямую, так икосвенно.Для прямых звонков я просто перенес их из AssemblyD в AssemblyC, и все работает.Для косвенных вызовов мне нужно вызвать метод в AssemblyB, который будет внутренне использовать Reflection для создания экземпляра класса в AssemblyA.Я могу сделать вызов AssemblyB напрямую из AssemblyD или косвенно через AssemblyC - любой из них будет приемлемым, но ни один из них не работает для меня.

Прямые вызовы прекрасно работают.Вызовы, использующие отражение, завершаются неудачно, если в стеке вызовов есть какой-либо частично доверенный код.Я не могу избежать отражения вызовов, которые выполняет AssemblyB - он выполняет для меня много другой работы перед тем, как делать эти вызовы - работу, которую я не могу дублировать в AssemblyC и просто делаю вызовы прямыми.

Iзагрузил проект, демонстрирующий это в BitBucket: https://bitbucket.org/jorupp/partialtrusttest. Исходя из моего понимания частичного доверия, все 4 должны работать (вызывая A напрямую из B или C и вызывая A через отражение от B или C), новызовы, основанные на отражении, терпят неудачу.

Я предполагаю, что мне нужно установить какое-то разрешение CAS или подобное в моем коде в AssemblyC, чтобы это работало, но я не могу понять, что.

Примечание: имена в моем сценарии явно надуманы, но реальный сценарий - это приложение Sharepoint, где AssemblyA - это Microsoft.Sharepoint.Taxonomy, AssemblyB - это Microsoft.Sharepoint, AssemblyC - моя пользовательская сборка с редактированием GAC, иAssemblyD - это моя пользовательская сборка, развернутая через веб-приложение.Насколько я могу судить, это не проблема, связанная с Sharepoint.

Заранее спасибо за любые идеи или помощь.

1 Ответ

1 голос
/ 28 мая 2011

И после того, как я потратил час на написание репротации и вопроса, объясняющего его, я наткнулся на решение (хотя я не уверен, что оно правильное):

Я пытался использовать кодкак это (в AssemblyC)

public void UseClassBToCreateClassAViaReflection()
{
    new SecurityPermission(PermissionState.Unrestricted).Assert();
    ClassB.CreateClassAViaReflection();
}

Что не работает.Это, однако, делает:

[PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
public void UseClassBToCreateClassAViaReflection()
{
    ClassB.CreateClassAViaReflection();
}

Я все еще не до конца получаю CAS, но, по крайней мере, это помогает мне преодолеть мою первую проблему и перейти к следующей.Я не думаю, что я создаю здесь целую систему безопасности, но я не совсем уверен ...

...