可以在CLR函数中使用动态类型吗?

时间:2015-02-10 09:33:34

标签: c# sql-server sql-server-2012 clr sqlclr

我的任务是编写CLR函数,使用Mandrill.Net批量发送电子邮件。在装配和其他问题遇到很多障碍之后,我设法修补了大部分功能。唯一剩下的就是添加发送这些电子邮件(我已经有了代码)。不幸的是,在我添加代码后,我收到了这个错误:

  

动态操作只能在同质AppDomain

中执行

事实证明,Mandrill.Net(以及引擎盖下使用的RestSharp)广泛使用了动态类型。显然,我确实在寻找这个问题的解决方案,而且我发现的大部分内容都是this

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

即将这两行添加到项目的配置文件中。我将解决方案应用于app.config文件,但没有任何改变,我仍然得到错误(是的,我在Sql Server中重新创建了程序集和函数)。

真相被告知我在Sql Server CLR上下文中找不到关于这个问题的任何内容,所以在我看来实际上可能无法在该上下文中使用这些类型(如SQL Server可以控制阻止使用动态类型而不是我自己的库的策略。这些动态类型实际上可以在SQL Server中的CLR函数中使用吗?

P.S。在我的代码中,我也使用Dapper。在早期阶段,当我明确使用dynamic类型来存储查询结果时,我也遇到了这个错误(实际上Dapper将这些返回为IEnumerable<dynamic>)。但是,在添加Linq Cast<Dictionary<string,object>>()之后,错误就消失了(尽管Dapper仍然可能在dynamic类型上运行)。

1 个答案:

答案 0 :(得分:0)

基于我得到here的答案,我可能无法在CLR中使用动态类型,或者至少不能在允许我使用Mandrill.Net的范围内使用。

我的猜测是,我实际上可以使用动态类型,只要我将它保存到单个命名空间即可。 Dapper可以在内部使用动态类型,我可以在我的CLR中使用dapper,但我不能让dapper将动态类型传递回我的CLR函数\ procedure(除非我将它们转换为不那么动态的东西)。

另一方面,Mandrill.Net将动态类型传递给RestSharp,这是对CAS策略(?)的禁止。