PCL中的xamarin securestring等效

时间:2017-05-03 04:24:09

标签: c# xamarin dependency-injection portable-class-library securestring

SecureString与PCL不友好。我知道这个问题可以解决使用依赖注入问题但是我不想这样做而是我想在PCL中使用一些等同于SecureString的东西。

但到目前为止,我无法找到任何其他类或框架。

2 个答案:

答案 0 :(得分:2)

任何可移植类库概要文件中都不存在

System.Security.*。您可以在一些较高版本的.NET Standard中找到它,它提供了更大的.NET子集。

你最好的选择,如果你修复使用PCL就是使用像PCLCrypto这样的库,或者每个平台滚动你自己的代码并在运行时注入它。

答案 1 :(得分:0)

您可以使用所谓的bait-and-switch trick

在这种情况下,它意味着您需要创建一个包含SecureString实现存根的强名称PCL程序集,包括您打算在应用程序中使用的SecureString的方法和属性。< / p>

例如:

namespace System.Security {
  public class SecureString {
    public SecureString() { }
    public int Length { get; }
    public void AppendChar(char c) { }
  }
}

至关重要的是,您包含的属性和方法使用与原始类完全相同的签名,因为在使用此技巧时您将依赖于签名等效。另一方面,您不需要提供有效的实现,因为这将由每个相应平台上的内置SecureString处理。

接下来,您需要为每个平台创建一个具有与PCL程序集相​​同的强名称的程序集,只需包含一个到SecureString的类型转发指令:

[assembly: TypeForwardedTo(typeof(SecureString))]

这依赖于以下事实:即使没有PCL配置文件定义SecureString,每个相应的平台都会这样做。因此,您在平台特定DLL中实际执行的操作是指出要用于代替PCL声明的SecureString的实现。

使用PCL和平台特定程序集,并假设它们共享相同的名称(例如 securestring.dll )并使用相同的密钥签名,您现在可以使用{{1}在你的实现中。

假设您有一个PCL程序集 foo.Core.dll ,它由平台特定的应用程序 foo.Windows.dll foo使用。 Android.dll foo.iOS.dll ,以及 foo.Core.dll 使用SecureString的位置。然后你应该像这样组织你的解决方案:

  • foo.Core.dll 应该引用 securestring.dll 的PCL版本。
  • foo.Windows.dll 应引用 foo.Core.dll Windows版 securestring.dll
  • foo.Android.dll 应该引用 foo.Core.dll Android版 securestring.dll
  • foo.iOS.dll 应该引用 foo.Core.dll iOS版本的 securestring.dll