C# 打开加密密钥在Powershell中有效,而不是在C中#

C# 打开加密密钥在Powershell中有效,而不是在C中#,c#,powershell,cng,C#,Powershell,Cng,我正在打开存储在HSM中的加密密钥。我的机器上安装了HSM的客户端库。如果运行以下Windows Powershell代码段: ##Open an existing Key $keyName = 'foo' $providername = 'SafeNetProtectApp Key Storage Provider' $provider = New-Object 'System.Security.Cryptography.CngProvider' -ArgumentList $provider

我正在打开存储在HSM中的加密密钥。我的机器上安装了HSM的客户端库。如果运行以下Windows Powershell代码段:

##Open an existing Key
$keyName = 'foo'
$providername = 'SafeNetProtectApp Key Storage Provider'
$provider = New-Object 'System.Security.Cryptography.CngProvider' -ArgumentList $providername
$key = [System.Security.Cryptography.CngKey]::Open($keyName, $provider)
它起作用了

如果我试图编译以下C#代码段:

我不明白为什么我可以在Powershell中使用相同的库打开密钥而不会出现问题。在同一台机器上,如果我尝试在C#中执行该操作,我会得到一个异常。有人能解释为什么会这样吗

其他事实

  • 项目不以.NET核心为目标
  • 在Visual Studio 2017 Shell中编译C#控制台应用程序

我写的项目针对的是错误的处理器架构。提供者库是64位的,但我的项目的目标是32位。我将我的项目改为以64位可执行文件为目标,它成功了


谢谢大家的帮助

您从何处获得此提供程序:SafeNetProtectApp密钥存储提供程序密钥存储提供程序您安装了一个CNG提供程序。您是否在visual studio中编译它?看起来您需要为该提供程序添加对DLL的引用。我是。在VS 2017 shell中编译。所以,我也这么想。问题,为什么我不需要在Posh中引用提供程序DLL,但我需要w/C?我遇到了一个关于“未知错误”-1073741823“的错误,在找到您的答案之前,我无法找出错误所在。谢谢:)
using System.Security.Cryptography;

namespace SaveSecret
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine(">>> Starting application <<<");

            string keyName = "foo";
            string providerName = "SafeNetProtectApp Key Storage Provider";
            CngProvider provider = new CngProvider(providerName);
            CngKey key = null;
            key = CngKey.Open(keyName, provider);

            System.Console.Write("[Hit Enter to Continue]");
            System.Console.ReadLine();
        }
    }
}
System.Security.Cryptography.CryptographicException
  HResult=0x8009001E
  Message=Provider DLL could not be found.

  Source=System.Core
  StackTrace:
   at System.Security.Cryptography.NCryptNative.OpenStorageProvider(String providerName)
   at System.Security.Cryptography.CngKey.Open(String keyName, CngProvider provider, CngKeyOpenOptions openOptions)
   at System.Security.Cryptography.CngKey.Open(String keyName, CngProvider provider)