Я сталкиваюсь с проблемой, когда вызовы, сделанные из сборки 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.
Заранее спасибо за любые идеи или помощь.