从C#Azure函数引用System.Data.SqlClient时修复PlatformNotSupportedException

时间:2017-12-08 17:00:13

标签: c# azure-functions .net-standard system.data

我正在使用Windows 10环境中netstandard2.0的目标框架在C#中创建Azure功能。该函数调用另一个类库中的方法,该方法创建一个SqlConnection实例。当我运行该函数时,我得到以下异常:

  

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:Exception   执行功能时:Functions.RefreshImages --->   System.Reflection.TargetInvocationException:异常已经发生   由调用目标抛出。 --->   System.PlatformNotSupportedException:System.Data.SqlClient不是   在这个平台上支持。在   System.Data.SqlClient.SqlConnection..ctor(String connectionString)......

显然Windows支持SqlConnection,所以我假设这里还有其他东西。

2 个答案:

答案 0 :(得分:1)

当通过反射动态加载使用 SqlConnection 的 .Net Standard 库时,会发生这种情况。 .Net 标准库通常会引用 System.Data.SqlClient,这似乎是一个没有实际实现的虚拟库。它显然确保了 lib 将在所有平台上编译,包括那些没有 Registry 的平台以及真正的 SqlClient 实现所依赖的其他平台特定的东西。

我能找到的最简单的解决方案是在宿主应用程序(动态加载 .Net 标准库的 .Net 核心应用程序)中添加对 Microsoft.Data.SqlClient NuGet 包的引用。

您可能会在解决方案资源管理器中看到一个小的黄色警告感叹号图标,因为 Visual Studio 认为您没有使用该库,如果您使用“删除未使用的引用”功能,它还会建议删除包。 PropertyGrid 有一个功能可以抑制警告,但我无法弄清楚应该填写 wat 编号,因为编译时警告没有出现在错误列表中...

答案 1 :(得分:0)

看起来这与loading a SQL connection via reflection in .NET core有关(你在const Checkbox = ({myRef, changeInput, checkboxText}) => { return ( <label> <input type="checkbox" ref={myRef} onChange={event => changeInput(event)} /> <div> {checkboxText} </div> </label> ) } export default class AreRefsAwesomeCheckbox extends Component { constructor(props) { super(props) this.handleInputChange = this.handleInputChange.bind(this) } handleInputChange() { let data = { isFeatured: this.refs.check_me.checked, } postJSON('/some/url', data) } componentDidMount() { const data = getJSON('/some/url') data.then(object => { // this.checkbox is the reference to the checkbox element you need this.checkbox.checked = object.will_i_have_a_nice_checkbox }) } render() { return ( <div> <label> <Checkbox myRef={ref => (this.checkbox = ref)} /> <div>Are refs good?</div> </label> </div> ) } } 上运行,但原则应该是相同的。)