2009-12-10 88 views
1

如果這是愚蠢的問題,我很抱歉,但是我花了兩天時間解決這個問題,並且無法使其工作。 這裏就是我所做的:無法訪問安裝到GAC中的程序集

  1. 創建一個新的類庫項目
  2. 添加了一個簡單方法sayHi()返回一個字符串
  3. 在屬性檢查「程序集簽名」,並使用強名稱密鑰文件的項目
  4. 編譯應用程序並將DLL複製到c:\ windows \ assemblies(並且我也嘗試使用具有類似結果的gacutil工具)
  5. 將以下內容添加到machine.config <compilation><assemblies><add assembly="gacTestClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31418215e131202e" />。這工作得很好,因爲如果我拼錯程序集名稱,任何.net應用程序將失敗並抱怨該行。
  6. 在.NET框架配置工具中使用程序集緩存查看器,我可以看到緩存中的程序集。
  7. 現在,當我嘗試使用它時,我的應用程序失敗,當我做using gacTestClassgacTestClass.gacTest.sayHi()。我收到一個錯誤,指出無法找到類型或名稱空間。

任何幫助表示讚賞。

編輯:

好吧,我跟着一個建議,我將努力使這項工作與web.config中,而不是machine.config中。

我將下列內容添加到我的web.config <compilation><assemblies><add assembly="gacTestClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31418215e131202e" />,並確保它通過拼寫錯誤的名稱,並觀看應用程序失敗。 現在,當我嘗試將using gacTestClass添加到我的.cs文件的頂部時,出現錯誤,指出無法找到類型或名稱空間。

以防萬一,這裏的代碼爲gacTestClass

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 
[assmbly:AssemblyKeyFile("sayHi.snk")] 
namespace gacTestClass { 
    public class gacTest { 
     public string sayHi() { 
      return "Hello there!"; 
     } 
    } 
} 
+1

我認爲,即使裝配在GAC中,您也必須添加參考。好處是程序集不需要複製到任何文件夾。 – 2009-12-10 15:44:14

+1

您可以複製/粘貼您收到的特定錯誤消息嗎?如果將程序集添加到machine.config或web.config中,則不需要在應用程序中添加引用。 – sestocker 2009-12-10 15:47:10

+0

@sestocker:如果他的app不是ASP.Net,他會的。 – SLaks 2009-12-10 15:50:03

回答

3

編輯:嘗試在你的項目上右擊,單擊添加引用,並添加你的DLL文件。

一般而言,您不應該修改machine.config

+0

爲什麼不能?我有多個應用程序,並且我不希望每次在服務器上安裝新應用程序時都需要添加引用。 – PBG 2009-12-10 15:51:02

+1

因爲如果明年你得到一個新的服務器,或者如果你轉移到.Net 4,你可能會忘記重新修改'machine.config'。 – SLaks 2009-12-10 15:52:22

+0

另外,這樣來自不同人的多個應用程序可以在同一臺服務器上生存。 **不要使用全局狀態來解決本地問題。** http://blogs.msdn.com/oldnewthing/archive/2008/12/11/9193695.aspx http://blogs.msdn.com/oldnewthing /archive/2009/10/15/9907370.aspx – SLaks 2009-12-10 15:54:19

4

試試這個:

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="Namespace" publicKeyToken="token" culture="neutral" /> 
    <bindingRedirect oldVersion="1.0.0.0" newVersion="1.1.0.0" /> 
    </dependentAssembly> 
</assemblyBinding></runtime> 

移動從Machine.config中的統計部以你的web.config,並給它一個嘗試。它應該在machine.config中正常工作,但我認爲如果您是GAC組件,許多應用程序將使用它。您將希望每個應用程序都能夠選擇要使用哪個版本的DLL(用於更簡單的升級路徑)。

此外,似乎很明顯,但要確保您試圖訪問的方法(gacTestClass.gacTest.sayHi())是公共的。

+0

我試着將代碼移動到web.config,但它不起作用。是的,大會是GAC,班級和方法都是公開的。 – PBG 2009-12-10 16:31:18

+0

那去哪了? – PBG 2009-12-10 17:25:51

+0

接下來 - 我認爲這只是共享點... – sestocker 2009-12-10 17:57:05

相關問題