2011-04-14 58 views
5

我已經移植髮展到另一臺計算機,如果我跑項目,我有這樣的例外:無法獲得公共密鑰StrongNameKeyPair

無法獲取StrongNameKeyPair公鑰。

HibernateException的:創建代理實例失敗

在原有計算機它的工作原理確定沒有問題。

我在谷歌上發現,它是一些加密的問題,我應該嘗試「sn -m n」,我不知道如何。 SN.EXE在多個文件夾,我tryed從命令行運行一些,但它寫道:

無法打開註冊表項 - 無法格式化錯誤信息00000005

我不知道問題是因爲NHibernate與否,還有更多類似的對話框,它只在一種情況下拋出這個異常。

有部分代碼whitch拋出異常:

public IList<DTO> GetAll(GridSortOptions sortOptions, DTOListModel<DTO> listModel) 
{ 
    return GetAllCriteria(sortOptions, CreateCriteria(), listModel).List<DTO>(); 
} 

從溶液中使用簽名沒有人項目。 我不明白這個錯誤意味着什麼,我應該尋找什麼。

回答

7

NHibernate動態創建.NET程序集(動態代理)並需要對它們進行簽名。默認情況下,Windows操作系統會將加密密鑰存儲配置爲計算機級別,並將密鑰存儲在C:\ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys中。很可能您的用戶可以在此文件夾中創建(例如)文本文件,但不能將其刪除,因爲您沒有完全控制。

您的選項是

  1. 獲得的C完全控制:通過修改可能不被推薦的權限\的Documents and Settings \所有用戶\應用數據\微軟\加密\ RSA \ MachineKeys的。

  2. 通過運行Windows SDK中的「sn.exe -m n」,將您的加密密鑰存儲更改爲用戶級別。 http://msdn.microsoft.com/en-us/library/k5b5tt23(v=VS.90).aspx這會將加密密鑰存儲放置在您的用戶本地配置文件下,您應該始終完全控制它。

網上有幾篇文章描述了類似的問題。例如,請參見http://support.targetprocess.com/Default.aspx?g=posts&t=305

+1

這是否也需要爲所有最終用戶安裝完成?有沒有一種方法可以說我不希望NHibernate簽署它的代碼? – fatty 2011-09-07 07:31:22

+1

support.targetprocess.com的鏈接已經死亡。 – 2012-04-18 01:19:11

4

今天有一個類似的問題,用不同的用例(一個運行在W2008R2盒子上的.NET服務)但是完全一樣的錯誤。

使用procmon我將其追溯到C:/ ProgramData/Microsoft/Crypto/RSA/MachineKeys中的鍵上失敗的寫入。

繼與這裏提到的文件夾的特殊權限添加EVERYONE指導解決了這一問題:http://toastergremlin.com/?p=432

此外,請確保您添加EVERYONE @本地機器並沒有大家@您的域名!

+0

http://ayende.com/blog/1441/unable-to-obtain-public-key-for-strongnamekeypair以及 – Aligned 2012-06-12 17:05:21

0

今天我有同樣的問題,不喜歡提供的解決方案。它們是:

  • 擁有自己的Castle.Core版本,並刪除了強大的命名代碼。 Reference
  • 修改文件夾的權限。參考:這個問題
  • 更改加密密鑰存儲。參考:這個問題

以下可能是一個骯髒的黑客,但它工作得很好,我不必向IT解釋爲什麼我想要所有的最終用戶計算機重新配置。

/// <summary> 
/// Ensures that NHibernate creates no strong named proxy assemblies. 
/// Assumes usage of Castle.DynamicProxy. Needs to be revisited 
/// after update of NHibernate or Castle.Proxy! 
/// </summary> 
private static void EnsureNHibernateCreatesNoStrongNamedProxyAssemblies() 
{ 
    if (!StrongNameUtil.CanStrongNameAssembly) 
    { 
     Logger.Debug("NHibernate is not trying to strong name assemblies." + 
        "No action needed."); 
     return; 
    } 

    const string FieldName = "canStrongNameAssembly"; 
    var type = typeof(StrongNameUtil); 
    var field = type.GetField(FieldName, BindingFlags.Static 
             | BindingFlags.NonPublic); 
    if (field == null) 
    { 
     Logger.Warn(
      "No field with the name {0} exists in the type {1}." 
      + "Can't change NHibernate to use weak named proxy assemblies.", 
      FieldName, type); 
     return; 
    } 

    field.SetValue(null, false); 

    if (StrongNameUtil.CanStrongNameAssembly) 
    { 
     Logger.Warn(
      "Couldn't change value of field {0} on type {1}. " 
      + "NHibernate will continue to use strong named proxy assemblies.", 
      FieldName, type); 
    } 
    else 
     Logger.Debug("Successfully changed NHibernate to use " 
        + "weak named proxy assemblies."); 
} 

只要確保在生成第一個代理之前在程序開始時調用此方法。

我想真正的解決辦法是升級到NHibernate的3.3這suppesdly沒有這個問題了,但現在這是不是一種選擇。

+0

他們是如何解決這個問題的? – hypersw 2016-03-16 16:05:33

1

對於遇到此問題的其他人,我只是在物理機器上遇到同樣的異常。一夜之間沒有任何變化,但這個例外從早上開始。

原來是磁盤空間不足的問題,而動態代理組件無法寫入到磁盤。只是意識到這一點,因爲我偶然注意到了Windows的「低磁盤空間」圖標。 :-P

清理出了一堆的(大)臨時文件使問題消失。