Можно ли использовать динамические типы в функциях CLR?

Мне было поручено написать функцию CLR, которая будет массово отправлять электронные письма с использованием Mandrill.Net. После многих препятствий со сборками и другими проблемами мне удалось исправить большую часть функции. Осталось только добавить отправку этих писем (для этого у меня уже был код). К сожалению, после того, как я добавил код, я получил эту ошибку:

Динамические операции могут выполняться только в однородном AppDomain.

Как оказалось, Mandrill.Net (и RestSharp, который используется под капотом) широко использует динамические типы. Очевидно, я искал решения этой проблемы, и большая часть того, что я нашел, выглядела как appdomain-error-while-l">это:

<NetFx40_LegacySecurityPolicy enabled="true"/>
<trust legacyCasModel="false" level="Full" />

Это добавление этих двух строк в файл конфигурации проекта. Я применил решение к файлу app.config, но ничего не изменилось, и я все еще получаю ошибку (да, я воссоздал сборку и функцию в Sql Server).

По правде говоря, я не смог найти ничего об этой проблеме в контексте CLR Sql Server, поэтому мне пришло в голову, что на самом деле может быть невозможно использовать эти типы в этом контексте (например, SQL Server контролирует политику, которая предотвращает использование динамических типов, а не моей собственной библиотеки). Можно ли использовать эти динамические типы в функциях CLR в SQL Server?

P.S. В своем коде я также использую Dapper. На более раннем этапе я также получил эту ошибку, когда явно использовал тип dynamic для хранения результатов запроса (на самом деле Dapper возвращает их как IEnumerable<dynamic>). Однако после добавления Linq Cast<Dictionary<string,object>>() ошибка исчезла (хотя Dapper, вероятно, все еще работал с типом dynamic).


person jahu    schedule 10.02.2015    source источник
comment
Вполне вероятно, что SQL Server игнорирует ваш настраиваемый файл конфигурации (в отличие от ASP.NET или обычного загрузчика .NET). В целях тестирования не могли бы вы добавить эти настройки (кстати, я думаю, вы имеете в виду legacyCasModel="true") в файл sqlservr.exe.config в том же каталоге, что и ваш sqlservr.exe? Вероятнее всего, потребуется перезагрузка SQL Server. Будьте осторожны, даже если это сработает, поскольку я не уверен, каковы все последствия этого шага (поскольку очевидно, что это будет глобальным для всех сборок, загруженных в SQL Server).   -  person Jeroen Mostert    schedule 13.02.2015


Ответы (1)


На основании ответа я получил здесь, вероятно, я не могу использовать динамические типы в CLR или, по крайней мере, не в такой степени, которая позволяет мне использовать Mandrill.Net.

Я предполагаю, что я действительно могу использовать динамические типы, пока я придерживаюсь одного пространства имен. Dapper может использовать динамические типы внутри себя, и я могу использовать dapper в своей CLR, но я не могу заставить dapper передавать динамические типы обратно в мою функцию\процедуру CLR (если только я не приведу их к чему-то менее динамичному).

С другой стороны, Mandrill.Net передает динамические типы в RestSharp, что не соответствует политикам CAS (?).

person jahu    schedule 03.03.2015