文章編號: 897297 - 上次校閱: 2007年11月14日 - 版次: 2.7

如何使用位於不同於應用程式的基底資料夾在 Visual Basic.NET 中或在 Visual Basic 2005 中的資料夾中的組件

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

簡介

本文將告訴您,如何取用位於非與應用程式基底資料夾 Microsoft Visual Basic.NET 或 Microsoft Visual Basic 2005 方案中不同的資料夾中的組件。

其他相關資訊

您在執行 Visual Basic.NET 或 Visual Basic 2005 的應用程式時常用的語言執行階段 (CLR) 期望找出應用程式使用全域組件快取] 或 [應用程式資料夾中的任何組件。 當 CLR 並不成功連結到組件時,會收到類似下列的錯誤訊息:
System.IO.FileNotFoundException 檔案或組件名稱 AssemblyName,或其相依性的其中之一,但是找不到。
您可以使用許多方法來找出位於不同的資料夾中的組件。本文將告訴您下列三種方法。

方法 1: 在全域組件快取中安裝組件

這個方法需要您簽署使用強式名稱組件。若要使用強式名稱簽署組件並再將組件安裝在全域組件] 快取請依照下列步驟執行:
  1. 使用強式名稱命名組件。要這麼做,請您執行下列步驟:
    1. 使用強式名稱工具 (Sn.exe) 隨附於 Microsoft.NET Framework 軟體開發套件 (SDK) 產生密碼編譯金鑰組。

      在 Microsoft Visual Studio.NET 以或 Microsoft Visual Studio 2005 命令提示字元中輸入下列命令:
      sn-k AssemblyName.snk
      這個命令會產生,並將金鑰組儲存在名為 AssemblyName.snk 的檔案。
    2. 在原始程式碼 (AssemblyInfo.vb) 中包含下列組件層級的屬性:
      <Assembly: AssemblyKeyFile("AssemblyName.snk")>
      
  2. 使用通用的組件快取工具 (Gacutil.exe) 在全域組件快取中註冊.NET Framework 組件。要執行此動作輸入下列命令在 [Visual Studio.NET 命令提示字元:
    gacutil/i AssemblyName.dll
如需有關如何工作與組件和全域組件快取的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站:
http://msdn2.microsoft.com/en-us/library/6axd4fx6(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/6axd4fx6(vs.71).aspx)
如需有關如何簽署使用強式名稱組件,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/xc31ft41(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/xc31ft41(vs.71).aspx)
附註如果許多組件存在,而且組件 Microsoft 元件物件模型 (COM) 物件上有相依性,這個方法可能是困難且耗時。任何組件相依性也必須是由 CLR 設定為可探索的。因此,如果您計劃您的組件安裝到全域組件快取,也安裝相依性組件至全域組件快取。

方法 2: 使用一個 Application.Config 檔案與程式碼基底標記一起

利用應用程式組態檔中,您可以指定的 CLR 應該尋找相依組件的位置。特別是,使用 程式碼基底 標記。利用這個標記您可以將您的組件放在個別的資料夾。不過,這個方法仍然需要您使用強式名稱命名程式庫組件。如果要使用應用程式組態檔,請依照下列步驟執行:
  1. 編譯您的程式庫組件。
  2. 可以使用強式名稱簽署組件。
  3. 從主要的應用程式將參考加入至您的程式庫組件,然後再編譯主應用程式。
  4. 從具備強式名稱的程式庫組件取得公開金鑰語彙基元 (Token)。要這麼做,請您執行下列步驟:
    1. 按一下 [開始],按一下 [所有程式],然後再按一下 [Microsoft Visual Studio.NET 2003年

      附註在 Visual 的 Studio 2005 中按一下 [開始],按一下 [所有程式,然後再按一下 [Microsoft Visual Studio 2005
    2. 按一下 [Visual Studio.NET 工具,然後按一下 [Visual Studio.NET 2003年命令提示字元]。

      附註在 Visual 的 Studio 2005 中按一下 [Visual Studio 2005 工具,然後按一下 [Visual Studio.NET 2005年命令提示字元
    3. 將目錄變更您的程式庫組件的位置。通常,位置是資源回收筒的程式庫組件專案的資料夾。
    4. 輸入下列命令並按下 ENTER:
      SN T MyLibrary.dll
      附註MyLibrary 取代為您的程式庫組件名稱。若要確保傳回正確值,請確定您使用中的大寫 T -T 切換。
    5. 這個命令會傳回十六進位的值,代表取得的程式庫組件的公開金鑰語彙基元。製作十六進位值將用於應用程式組態檔的複本。
  5. 從具備強式名稱的程式庫組件取得組件版本。若要取得組件版本,使用下列方法之一:
    • 方法 a: Windows 檔案總管的檔案屬性
      1. 在 Windows 檔案總管中用滑鼠右鍵按一下您的程式庫組件,然後按一下 [內容]。
      2. 在 [屬性] 對話方塊按一下 [版本] 索引標籤。
      3. 其他版本資訊,] 之下按一下 [組件版本]。製作應用程式組態檔中將會使用這個版本值的複本。
    • 方法 b: MSIL 解譯器 (ILDASM)
      1. 在 [Visual Studio.NET 2003年命令提示字元,鍵入 ILDASM,並按下 ENTER。
      2. 在 [檔案] 功能表上, 按一下 [開啟舊檔]。
      3. 按一下自訂的組件,然後按一下 [開啟舊檔]。
      4. 在下方] 窗格中尋找組件版本 (.ver)。 下列是組件版本的範例:
        .assembly yourAssemblyName
        {
          .ver 1:0:1969:29451
        }
        
        附註 在本例組件版本是 1.0.1969.29541。
  6. 建立應用程式設定檔。要這麼做,請您執行下列步驟:
    1. 將下列 XML 程式碼貼入 「 記事本 」 中:
      <configuration>
         <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
               <dependentAssembly>
                  <assemblyIdentity name="MyLibrary"
                                    culture="neutral" 
                                    publicKeyToken="fa4e781ae585ee8a"/>
      
                  <codeBase version="1.0.1074.32347"
      		        href="FILE://C:/assemblies/myLibrary.dll"/>
               </dependentAssembly>
            </assemblyBinding>
         </runtime>
      </configuration>
      
    2. 變更下列的 XML 項目屬性。
      摺疊此表格展開此表格
      元素屬性進行這項變更
      assemblyIdentity 名稱MyLibrary 變更您的程式庫組件的名稱。
      assemblyIdentity publicKeyToken變更公開金鑰語彙基元值您在步驟 4 中複製 publicKeyToken 屬性。
      程式碼基底版本變更版本值,您在步驟 5 中複製 版本 屬性。
      程式碼基底 href變更 href 屬性,以指向完整路徑名稱和您的程式庫組件檔案名稱。
    3. 將檔案儲存為主要組件.exe 的檔案名稱。作為檔案名稱副檔名.config。比方說如果您的主要組件名稱為 MyProject.exe",應用程式組態檔案名稱是"MyProject.exe.config]。您必須在主應用程式組件所在的同一個資料夾中儲存此檔案。
如需詳細資訊請造訪下列 MSDN 網站:
指定組件的位置
http://msdn2.microsoft.com/en-us/library/4191fzwb(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/4191fzwb(vs.71).aspx)

<codebase> 項目
http://msdn2.microsoft.com/en-us/library/efs781xb(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/efs781xb(vs.71).aspx)

執行階段如何找出組件
http://msdn2.microsoft.com/en-us/library/yx7xezcf(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/yx7xezcf(vs.71).aspx)

方法 3: 使用 System.reflection.assembly.LoadFrom 方法

這個方法會使用 Assembly.LoadFrom 方法明確載入的組件,從完整的路徑名稱及完整的檔案名稱。要這麼做,請您執行下列步驟:
  1. 編譯您的程式庫組件。
  2. 請使用類似於下列程式碼範例來載入組件的程式碼:
    Dim yourAssembly As System.Reflection.Assembly = _
          System.Reflection.Assembly.LoadFrom("c:\yourAssembly.dll")
    
附註如果您任何相依的組件您應該在主要組件所在的相同路徑中找到它們。

如需有關 Assembly.LoadFrom 方法的詳細資訊,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.loadfrom(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.loadfrom(vs.71).aspx)

方法 4: 使用 AssemblyResolve 事件

AssemblyResolve 事件發生於每當 CLR 未成功嘗試繫結至組件。應用程式中使用 AddHandler 方法,來新增事件處理常式,每當 AssemblyResolve 事件發生時便會傳回正確的組件。

附註這個方法並 需要藉由使用強式名稱命名組件。

AssemblyResolve 事件處理常式必須傳回 [組件] 物件,表示 CLR 必須繫結的組件。通常您可以使用 Assembly.LoadFrom 方法載入組件。然後,傳回載入的組件。

附註事件處理常式必須位於不包含任何 relocated 組件參考的程序。此外,取決於 relocated 組件的任何程式碼呼叫之前,必須呼叫事件處理常式。

下列程式碼是使用 AssemblyResolve 事件來載入組件的應用程式的範例:
Module Module1
    Sub Main()
        Dim f As Form1

        'Set up event handler for AssemblyResolve event
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, _
                   AddressOf MyResolveEventHandler

        f = New Form1()
        Application.Run(f)
    End Sub

    Function MyResolveEventHandler(ByVal sender As Object, _
                                   ByVal args As ResolveEventArgs) As [Assembly]

        'Load the assembly from the correct location and return the assembly
        'This handler is only called if we try to bind to the assembly and the attempt fails.
        Dim MyAssembly As [Assembly]
        MyAssembly = [Assembly].LoadFrom("C:\assemblies\MyLibrary.dll")
        Return MyAssembly
    End Function
End Module


'Some sample code in Form1 which depends on the external assembly
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click

        Dim x As MyLibrary.Application
        x = New MyLibrary.Application()
        x.MyMethod()
    End Sub
End Class
如需有關 AppDomain.AssemblyResolve 事件的詳細資訊,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/system.appdomain.assemblyresolve(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.appdomain.assemblyresolve(vs.71).aspx)

?考

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
302340? (http://support.microsoft.com/kb/302340/ ) 如何建立具有強式名稱在.NET Framework SDK 中的組件

這篇文章中的資訊適用於:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbmt kbvs2005swept kbvs2005applies kbprogramming kbhowto kbinfo KB897297 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:897297? (http://support.microsoft.com/kb/897297/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。