ServicePointManager 在 CLR 类库中未初始化?

ServicePointManager not initialised when in CLR class library?

提问人:Eleco Martin 提问时间:6/19/2023 更新时间:6/19/2023 访问量:32

问:

我继承了一个 CLR 类库 (.NET Framework 4.7.2),它提供了一个查询 Azure 中的表存储的函数。从本机 C++ 可执行文件调用的函数当前失败,因为 TLS 设置不足。

如果我查询函数开始时属性的设置,我发现它设置为(均已弃用!我必须将其显式设置为 Tls12 才能使函数正常工作。ServicePointManager.SecurityProtocolSSl3|Tls

相反,如果我创建一个新的 CLR 控制台应用程序项目(也是 Framework 4.7.2)并添加一个仅查询安全协议的函数,我发现它被设置为 .SystemDefault

我认为在类库中拥有该函数会阻止安全协议被初始化是正确的吗?在这种情况下,我必须显式设置属性吗?据推测,.NET Framework 在管理应用程序时会执行一些初始化,但在类库的情况下则不然。如果属实,任何人都可以对此进行一些扩展吗?ServicePointManager.SecurityProtocol

此外,通过将其设置为 Tls12,我是否可能会破坏其他调用代码,例如对 Tls11 感到满意的旧代码,或者坚持使用 Tls13 的未来代码?

.NET C++-CLI 类库 system.net

评论

0赞 Charlieface 6/19/2023
有人可能在某处手动设置。不,除非在 .Net 4.5 或更早版本上,否则不应手动设置它。如果该库正在这样做,则应对其进行更改。ServicePointManager.SecurityProtocol
0赞 Hans Passant 6/19/2023
从 .NET 4.7 开始,此属性的行为已更改。SystemDefault 现在是正常默认值。换句话说,对于您的控制台模式项目,它现在知道您的目标是 4.7,而在您的旧类库项目中它没有。此信息由 [assembly: TargetFramework] 属性携带。作为生成过程的一部分,它以一种复杂的方式自动生成,msbuild 创建一个存储在 TEMP 目录中的小文本文件,并具有该属性。它被编译为普通的 C++ 源文件。显然这没有发生。查看详细的 msbuild 跟踪以获取提示。
2赞 Hans Passant 6/19/2023
我刚刚检查了一下,它查看了属性的Assembly.GetEntryAssembly()。问题是,当本机 C++ 代码是有效的入口点时,该方法返回 null。所以找不到属性,你看到的是预期的结果。考虑自己分配它。

答: 暂无答案