2017-08-04 14 views
0

を使用して実行可能ファイルを実行するプログラムがあります。私が呼び出す実行ファイルは、ProgramDataのフォルダを更新する第三者プログラムです。 ProgramDataのフォルダが更新されると、プログラムの次の行が更新され、最新の変更が読み込まれます。ProgramDataの最新の変更を読み取ることができません

私は、実行可能ファイルが実行された後でも最新の変更を読み取ることができないことに気付きました。しかし、私が最初からプログラムを再実行すると、変更が正しく読み取られることがわかります。私はこれが実行中に変更を見ることができないAppDomainと関係があると仮定しています。

私はここで働くことができますか?方法HSMTransactionHandler内部以下のコードで

HSM_ENCRYPTION_KEY_NOT_FOUND

メッセージと例外が発生した場合、私はメソッドUpdateFromRFSを呼び出すことによって、EXEを実行し、再帰的HSMTransactionHandlerを呼び出します。 exeの実行は必要なリソースを取得しますが、コードはそれを読み取っていません。現在のプログラムの実行中に別のプログラムを実行すると、2番目のプログラムは問題なくリソースを読み取ります。どのようにして、プロセスやアプリケーションドメインが起動した後にProgramDataフォルダに起こった変更を見ることができるのでしょうか?

私はPKCS11Interopライブラリを使用していて、ネイティブdllの周りに構築された.netラッパーを使用していることを知っています。ネイティブdllを使用するとこの問題が発生する可能性があるかどうかもわかりません。

ご協力いただければ幸いです。

public sealed class KeyStoreOperations 
    { 
     private KeyStoreContext m_keyStoreContext; 

     private static Pkcs11 m_Pkcs11; 
     private static readonly object _syncLockPkcs11 = new object(); 
     private static readonly object _syncLockHSMLogin = new object(); 

     public KeyStoreOperations(KeyStoreContext keyStoreContext) 
     { 
      m_keyStoreContext = keyStoreContext; 
      InitializePkcs11Object(); 
     } 

     public string Encrypt(string keyName, string message) 
     { 
      ValidateInputs(message, "Message"); 
      var encryptedMessage = string.Empty; 
      HSMTransactionHandler((Session session) => 
      { 
       Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS); 
       var publicKey = GetPublicKey(keyName, session); 
       if (publicKey == null) 
        throw new HSMException(ErrorConstant.HSM_ENCRYPTION_KEY_NOT_FOUND); 
       var originalKeyBytes = EncryptionHelper.Decode(message); 
       var encryptedKeyBytes = session.Encrypt(mechanism, publicKey, originalKeyBytes); 
       encryptedMessage = EncryptionHelper.Encode(encryptedKeyBytes); 
      }); 
      return encryptedMessage; 
     } 

     public string Decrypt(string keyName, string cipher) 
     { 
      ValidateInputs(cipher, "Cipher"); 
      var decryptedMessage = string.Empty; 
      HSMTransactionHandler((Session session) => 
      { 
       Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS); 
       var privateKey = GetPrivateKey(keyName, session); 
       if (privateKey == null) 
        throw new HSMException(ErrorConstant.HSM_ENCRYPTION_KEY_NOT_FOUND); 
       var encryptedSymmetricKeyBytes = EncryptionHelper.Decode(cipher); 
       var decryptedSymmetricKeyBytes = session.Decrypt(mechanism, privateKey, encryptedSymmetricKeyBytes); 
       decryptedMessage = EncryptionHelper.Encode(decryptedSymmetricKeyBytes); 
      }); 
      return decryptedMessage; 
     } 

     #region Private methods 

     #region Validations 

     private void ValidateInputs(string input, string name) 
     { 
      if (string.IsNullOrEmpty(input)) 
       throw new ArgumentNullException(name); 
     } 

     #endregion Validations 

     private void HSMTransactionHandler(Action<Session> action, bool commit = false, int retrialAttempt = 5) 
     { 
      Slot hsmSlot = null; 
      Session hsmSession = null; 
      bool logggedIn = false; 
      try 
      { 
       hsmSlot = GetSlot(m_NCipherKeyStoreContext.ModuleToken); 
       hsmSession = hsmSlot.OpenSession(false); 
       lock (_syncLockHSMLogin) 
       { 
        hsmSession.Login(CKU.CKU_USER, m_NCipherKeyStoreContext.SecurityPin); 
        logggedIn = true; 
        action(hsmSession); 
        hsmSession.Logout(); 
        logggedIn = false; 
       } 
       if (commit) 
        CommitToRFS(); 
      } 
      catch (Pkcs11Exception ex) 
      { 
       HandleHSMErrors(ex); 
      } 
      catch (HSMException ex) 
      { 
       if (ex.Message == EncryptionKeyStoreErrorConstant.HSM_ENCRYPTION_KEY_NOT_FOUND && retrialAttempt > 0) 
       { 
        if (logggedIn) 
        { 
         hsmSession.Logout(); 
         logggedIn = false; 
        } 
        if (!(hsmSession == null)) 
         hsmSession.CloseSession(); 
        UpdateFromRFS(); 
        Thread.Sleep(1000); 
        HSMTransactionHandler(action, retrialAttempt: retrialAttempt - 1); 
       } 
       else 
        throw ex; 
      } 
      finally 
      { 
       if (logggedIn) 
        hsmSession.Logout(); 
       if (!(hsmSession == null)) 
        hsmSession.CloseSession(); 
      } 
     } 

     private void UpdateFromRFS() 
     { 
      using (var rfsSyncProcess = GetRfsSyncProcess("--update")) 
      { 
       ExecuteRFSSyncProcess(rfsSyncProcess); 
      } 
     } 

     private Process GetRfsSyncProcess(string args) 
     { 
      Process rfsSyncProcess = new Process(); 
      rfsSyncProcess.StartInfo.FileName = "C:\\Program Files (x86)\\nCipher\\nfast\\bin\\rfs-sync.exe"; 
      rfsSyncProcess.StartInfo.Arguments = args; 
      return rfsSyncProcess; 
     } 

     private void ExecuteRFSSyncProcess(Process rfsSyncProcess) 
     { 
      rfsSyncProcess.Start(); 
      rfsSyncProcess.WaitForExit(); 
     } 

     private ObjectHandle GetPrivateKey(string keyName, Session session) 
     { 
      ObjectHandle privateKey = null; 
      List<ObjectHandle> foundObjects = null; 
      List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>(); 
      objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
      objectAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true)); 

      foundObjects = session.FindAllObjects(objectAttributes); 
      if (foundObjects != null && foundObjects.Count > 0) 
      { 
       privateKey = foundObjects[0]; 
      } 
      return privateKey; 
     } 

     private ObjectHandle GetPublicKey(string keyName, Session session) 
     { 
      ObjectHandle publicKey = null; 
      List<ObjectHandle> foundObjects = null; 
      List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>(); 
      objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
      objectAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, false)); 

      foundObjects = session.FindAllObjects(objectAttributes); 
      if (foundObjects != null && foundObjects.Count > 0) 
      { 
       publicKey = foundObjects[0]; 
      } 
      return publicKey; 
     } 

     private List<ObjectAttribute> CreatePublicKeyTemplate(string keyName, byte[] ckaId) 
     { 
      List<ObjectAttribute> publicKeyAttributes = new List<ObjectAttribute>(); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, false)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ENCRYPT, true)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY, true)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY_RECOVER, true)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_WRAP, true)); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_MODULUS_BITS, Convert.ToUInt64(m_keyStoreContext.KeySize))); 
      publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PUBLIC_EXPONENT, new byte[] { 0x01, 0x00, 0x01 })); 

      return publicKeyAttributes; 
     } 

     private List<ObjectAttribute> CreatePrivateKeyTemplate(string keyName, byte[] ckaId) 
     { 
      List<ObjectAttribute> privateKeyAttributes = new List<ObjectAttribute>(); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SENSITIVE, true)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_DECRYPT, true)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN, true)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN_RECOVER, true)); 
      privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_UNWRAP, true)); 

      return privateKeyAttributes; 
     } 

     private Slot GetSlot(string tokenLabel) 
     { 
      Slot matchingSlot = null; 
      List<Slot> slots = m_Pkcs11.GetSlotList(true); 
      matchingSlot = slots[0]; 
      if (tokenLabel != null) 
      { 
       matchingSlot = null; 
       foreach (Slot slot in slots) 
       { 
        TokenInfo tokenInfo = null; 
        try 
        { 
         tokenInfo = slot.GetTokenInfo(); 
        } 
        catch (Pkcs11Exception ex) 
        { 
         if (ex.RV != CKR.CKR_TOKEN_NOT_RECOGNIZED && ex.RV != CKR.CKR_TOKEN_NOT_PRESENT) 
          throw; 
        } 

        if (tokenInfo == null) 
         continue; 

        if (!string.IsNullOrEmpty(m_keyStoreContext.ModuleToken)) 
         if (0 != string.Compare(m_keyStoreContext.ModuleToken, tokenInfo.Label, StringComparison.Ordinal)) 
          continue; 

        matchingSlot = slot; 
        break; 
       } 

       if (matchingSlot == null) 
        throw new HSMException(string.Format(ErrorConstant.HSM_CONFIGURATION_ERROR_INCORRECT_SLOT, tokenLabel)); 
      } 
      return matchingSlot; 
     } 

     private void InitializePkcs11Object() 
     { 
      if (m_Pkcs11 == null) 
      { 
       lock (_syncLockPkcs11) 
       { 
        m_Pkcs11 = new Pkcs11(m_keyStoreContext.PKCS11LibraryPath, true); 
       } 
      } 
     } 

     private void HandleHSMErrors(Pkcs11Exception ex) 
     { 
      if (ex.RV == CKR.CKR_PIN_INCORRECT) 
      { 
       throw new HSMException(ErrorConstant.HSM_CONFIGURATION_ERROR_PIN_INCORRECT, ex); 
      } 
      else 
      { 
       throw new HSMException(ErrorConstant.HSM_CONFIGURATION_ERROR_GENERIC, ex); 
      } 
     } 

     #endregion 
    } 

編集1:ここでは 私のために働い変更されたコードであり、ここで最も重要なことは、cknfastrcファイル

0に変数 CKNFAST_ASSUME_SINGLE_PROCESSを設定することであることに注意してください以下

コードです

public sealed class KeyStoreOperations 
     { 
      private KeyStoreContext m_keyStoreContext; 

      private static Pkcs11 m_Pkcs11; 
      private static readonly object _syncLockPkcs11 = new object(); 
      private static readonly object _syncLockHSMLogin = new object(); 

      public KeyStoreOperations(KeyStoreContext keyStoreContext) 
      { 
       m_keyStoreContext = keyStoreContext; 
       InitializePkcs11Object(); 
      } 

      public string Encrypt(string keyName, string message) 
      { 
       ValidateInputs(message, "Message"); 
       var encryptedMessage = string.Empty; 
       HSMTransactionHandler((Session session) => 
       { 
        Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS); 
        var publicKey = GetPublicKey(keyName, session); 
        if (publicKey == null) 
         throw new HSMException(ErrorConstant.HSM_ENCRYPTION_KEY_NOT_FOUND); 
        var originalKeyBytes = EncryptionHelper.Decode(message); 
        var encryptedKeyBytes = session.Encrypt(mechanism, publicKey, originalKeyBytes); 
        encryptedMessage = EncryptionHelper.Encode(encryptedKeyBytes); 
       }); 
       return encryptedMessage; 
      } 

      public string Decrypt(string keyName, string cipher) 
      { 
       ValidateInputs(cipher, "Cipher"); 
       var decryptedMessage = string.Empty; 
       HSMTransactionHandler((Session session) => 
       { 
        Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS); 
        var privateKey = GetPrivateKey(keyName, session); 
        if (privateKey == null) 
         throw new HSMException(ErrorConstant.HSM_ENCRYPTION_KEY_NOT_FOUND); 
        var encryptedSymmetricKeyBytes = EncryptionHelper.Decode(cipher); 
        var decryptedSymmetricKeyBytes = session.Decrypt(mechanism, privateKey, encryptedSymmetricKeyBytes); 
        decryptedMessage = EncryptionHelper.Encode(decryptedSymmetricKeyBytes); 
       }); 
       return decryptedMessage; 
      } 

      #region Private methods 

      #region Validations 

      private void ValidateInputs(string input, string name) 
      { 
       if (string.IsNullOrEmpty(input)) 
        throw new ArgumentNullException(name); 
      } 

      #endregion Validations 

      private void HSMTransactionHandler(Action<Session> action, bool commit = false, int retrialAttempt = 5) 
      { 
       Slot hsmSlot = null; 
       Session hsmSession = null; 
       bool logggedIn = false; 
       try 
       { 
        hsmSlot = GetSlot(m_NCipherKeyStoreContext.ModuleToken); 
        hsmSession = hsmSlot.OpenSession(false); 
        lock (_syncLockHSMLogin) 
        { 
         hsmSession.Login(CKU.CKU_USER, m_NCipherKeyStoreContext.SecurityPin); 
         logggedIn = true; 
         action(hsmSession); 
         hsmSession.Logout(); 
         logggedIn = false; 
        } 
        if (commit) 
         CommitToRFS(); 
       } 
       catch (Pkcs11Exception ex) 
       { 
        HandleHSMErrors(ex); 
       } 
       catch (HSMException ex) 
       { 
        if (ex.Message == EncryptionKeyStoreErrorConstant.HSM_ENCRYPTION_KEY_NOT_FOUND && retrialAttempt > 0) 
        { 
         if (logggedIn) 
         { 
          hsmSession.Logout(); 
          logggedIn = false; 
         } 
         if (!(hsmSession == null)) 
         { 
          hsmSession.CloseSession(); 
          hsmSession = null; 
         } 
         UpdateFromRFS(); 
         Thread.Sleep(1000); 
         if (!m_Pkcs11.Disposed) 
         { 
          m_Pkcs11.Dispose(); 
          m_Pkcs11 = null; 
         } 
         HSMTransactionHandler(action, retrialAttempt: retrialAttempt - 1); 
        } 
        else 
         throw ex; 
       } 
       finally 
       { 
        if (logggedIn) 
         hsmSession.Logout(); 
        if (!(hsmSession == null)) 
         hsmSession.CloseSession(); 
       } 
      } 

      private void UpdateFromRFS() 
      { 
       using (var rfsSyncProcess = GetRfsSyncProcess("--update")) 
       { 
        ExecuteRFSSyncProcess(rfsSyncProcess); 
       } 
      } 

      private Process GetRfsSyncProcess(string args) 
      { 
       Process rfsSyncProcess = new Process(); 
       rfsSyncProcess.StartInfo.FileName = "C:\\Program Files (x86)\\nCipher\\nfast\\bin\\rfs-sync.exe"; 
       rfsSyncProcess.StartInfo.Arguments = args; 
       return rfsSyncProcess; 
      } 

      private void ExecuteRFSSyncProcess(Process rfsSyncProcess) 
      { 
       rfsSyncProcess.Start(); 
       rfsSyncProcess.WaitForExit(); 
      } 

      private ObjectHandle GetPrivateKey(string keyName, Session session) 
      { 
       ObjectHandle privateKey = null; 
       List<ObjectHandle> foundObjects = null; 
       List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>(); 
       objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
       objectAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true)); 

       foundObjects = session.FindAllObjects(objectAttributes); 
       if (foundObjects != null && foundObjects.Count > 0) 
       { 
        privateKey = foundObjects[0]; 
       } 
       return privateKey; 
      } 

      private ObjectHandle GetPublicKey(string keyName, Session session) 
      { 
       ObjectHandle publicKey = null; 
       List<ObjectHandle> foundObjects = null; 
       List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>(); 
       objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
       objectAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, false)); 

       foundObjects = session.FindAllObjects(objectAttributes); 
       if (foundObjects != null && foundObjects.Count > 0) 
       { 
        publicKey = foundObjects[0]; 
       } 
       return publicKey; 
      } 

      private List<ObjectAttribute> CreatePublicKeyTemplate(string keyName, byte[] ckaId) 
      { 
       List<ObjectAttribute> publicKeyAttributes = new List<ObjectAttribute>(); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, false)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ENCRYPT, true)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY, true)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY_RECOVER, true)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_WRAP, true)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_MODULUS_BITS, Convert.ToUInt64(m_keyStoreContext.KeySize))); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PUBLIC_EXPONENT, new byte[] { 0x01, 0x00, 0x01 })); 

       return publicKeyAttributes; 
      } 

      private List<ObjectAttribute> CreatePrivateKeyTemplate(string keyName, byte[] ckaId) 
      { 
       List<ObjectAttribute> privateKeyAttributes = new List<ObjectAttribute>(); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SENSITIVE, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_DECRYPT, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN_RECOVER, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_UNWRAP, true)); 

       return privateKeyAttributes; 
      } 

      private Slot GetSlot(string tokenLabel) 
      { 
       Slot matchingSlot = null; 
       List<Slot> slots = m_Pkcs11.GetSlotList(true); 
       matchingSlot = slots[0]; 
       if (tokenLabel != null) 
       { 
        matchingSlot = null; 
        foreach (Slot slot in slots) 
        { 
         TokenInfo tokenInfo = null; 
         try 
         { 
          tokenInfo = slot.GetTokenInfo(); 
         } 
         catch (Pkcs11Exception ex) 
         { 
          if (ex.RV != CKR.CKR_TOKEN_NOT_RECOGNIZED && ex.RV != CKR.CKR_TOKEN_NOT_PRESENT) 
           throw; 
         } 

         if (tokenInfo == null) 
          continue; 

         if (!string.IsNullOrEmpty(m_keyStoreContext.ModuleToken)) 
          if (0 != string.Compare(m_keyStoreContext.ModuleToken, tokenInfo.Label, StringComparison.Ordinal)) 
           continue; 

         matchingSlot = slot; 
         break; 
        } 

        if (matchingSlot == null) 
         throw new HSMException(string.Format(ErrorConstant.HSM_CONFIGURATION_ERROR_INCORRECT_SLOT, tokenLabel)); 
       } 
       return matchingSlot; 
      } 

      private void InitializePkcs11Object() 
      { 
       if (m_Pkcs11 == null) 
       { 
        lock (_syncLockPkcs11) 
        { 
         m_Pkcs11 = new Pkcs11(m_keyStoreContext.PKCS11LibraryPath, true); 
        } 
       } 
      } 

      private void HandleHSMErrors(Pkcs11Exception ex) 
      { 
       if (ex.RV == CKR.CKR_PIN_INCORRECT) 
       { 
        throw new HSMException(ErrorConstant.HSM_CONFIGURATION_ERROR_PIN_INCORRECT, ex); 
       } 
       else 
       { 
        throw new HSMException(ErrorConstant.HSM_CONFIGURATION_ERROR_GENERIC, ex); 
       } 
      } 

      #endregion 
     } 

編集2:CKNFAST_ASSUME_SINGLE_PROCESSを0に設定しなくても動作していることを確認したので、pkcs11オブジェクトを破棄して再初期化する必要があります。

+0

これを読みやすくするために、関数呼び出しとディレクトリ名にインラインコードマーカー( '\' ')を付けました。あなたの質問を編集してコードを追加して、あなたがしていることを正確に見ることができます。 – Chris

答えて

1

以前の質問#1#2#3に基づいて、(あなたがそれを書いていないので)私はあなたがrfs-sync.exeを実行していることを推測していますし、あなたのPKCS#11ライブラリはまだたての同期キーが表示されません。この場合、HSMユーザーガイドに問い合わせて、検索操作を実行するたびにPKCS#11ライブラリがローカルFSを読み取るようにする変数(CKNFAST_FAKE_ACCELERATOR_LOGINに似ています)を検索する必要があります。その変数がなければ、PKCS#11ライブラリは初期化中にローカルFSの内容をキャッシュするだけです。

+0

文書でCKNFAST_ASSUME_SINGLE_PROCESSという名前の変数が見つかりました。これは私があなたが参照していたものでなければならないと思います。これを0に設定しても問題は解決しません。 – Aashish

+0

最後に、私はこれを得ることができました。 CKNFAST_ASSUME_SINGLE_PROCESSを0に設定することに加えて、pkcs11オブジェクトでC_Finalizeを呼び出す必要があり、魅力的に機能しました。ありがとう@すべてのヘルプのためのjariq、私は本当にそれを感謝します。 – Aashish

+0

私はCKNFAST_ASSUME_SINGLE_PROCESSを0に設定せずにこの作業を行うことができました。これは必須ではないかもしれません。PKCS11オブジェクトを処分するだけです。 – Aashish

0

Process.Start()はすぐに戻ります。つまり、プロセスにはstartedが含まれています。つまり、プロセスが完了していないことを意味します。

一般的に、処理を完了するためにはsome sort of waitが必要です。

、つまりProcess.WaitForExit()またはProcess.Exitedイベントを使用してください。

+0

私はこの質問に言及していませんが、私はすでにそれをやっています。 – Aashish

関連する問題