2009-01-28 62 views
3

我在這方面不是很有經驗 - 所以我有幾個問題。首先,所有.Net創建的DLL都有自己的GUID?如果沒有,我的問題是如何獲得一個並將其與DLL關聯。DLL中的GUID(.Net)

然後問題是,我如何得到該dll的GUID - 即。給出一個DLL路徑(c:\ some \ path \ to \ a \ file.dll)如何確定它的GUID?另外,有沒有一種簡單的方法去其他方式(GUID - > DLL) - 我已經閱讀了一些關於這個,但很多它指的是VB6 DLL和COM的東西......這是否仍然適用於.Net DLLs ?

更新:感謝您的答案。也許我在問錯誤的問題。我想爲我的每個DLL文件都有一個唯一的ID,以便我可以在數據庫中引用它們。我希望能夠獲取存儲在數據庫中的唯一ID,然後輕鬆找到DLL並使用它做一些事情。從答案所說的也許我不應該使用GUID,那麼有沒有一種.Net的方式來做到這一點?

+0

那麼你打算如何「發現」它們?他們在哪裏存儲,在你本地機器上的gac?如果是這樣的話,那麼他們必須是強命名的,如果他們只是文件,那麼當然數據庫存儲路徑給他們,在這一點上,guid是毫無意義的,除非作爲驗證階段... – ShuggyCoUk 2009-01-29 10:56:38

回答

0

要回答第二個問題(GUID - >組件),這是簡單的如果DLL已經加載,你只是想找到其中一個有一個GUID(如果有的話),你可以簡單地做

using System; 
using System.Reflection; 
using System.Runtime.InteropServices; 

static Assembly FindAssemblyForGuid(Guid match) 
{ 
    foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     object[] attributes = a.GetCustomAttributes(typeof(GuidAttribute)) ; 
     if (attributes.Length > 0) 
     { 
      foreach (GuidAttribute g in attributes) 
      { 
       if (g.Value == match) 
        return a; 
      } 
     } 
    } 
    return null; // failed to find it 
} 

如果你想這樣做沒有它被加載,你需要將它加載到一個臨時的應用程序域,檢查它,然後刪除應用程序域或使用非託管內省api做同樣的事情,但不需要釋放之後的任何事

0

作爲Visual Studio用戶必須在AssemblyInfo.cs中一看,其中組件GUID定義 [assembly: Guid("abc...")]

0

我認爲我們必須要問的問題是,爲什麼你覺得你需要一個GUID爲您裝配?除非它是COM可用的,否則不會通過GUID加載或註冊CLSID。

3

我想你可能會在託管程序集和COM組件之間感到困惑。 COM使用GUID以類ID(CLSID)和接口ID(IID)的形式標識組件和接口。信息存儲在註冊表中,用於創建COM對象實例。 .Net不使用這種機制來識別組件和類。類似的註冊情況是組件爲strong named並存儲在GAC中。在.Net中使用GUID爲的幾個地方是 - 包括COM互操作 - 但彙編識別不是其中之一。

+0

感謝您的回覆,我更新了現在的問題希望能夠讓我想要更清楚一些。 – robintw 2009-01-29 09:23:05

2

[assembly:Guid(「...」)]屬性通常在您的AssemblyInfo.cs文件中定義。默認情況下,當你創建一個新項目時,Visual Studio會自動爲你提供一個Guid,但是如果你要將你的程序集暴露給COM,這真的很有用。 .NET框架本身不使用這個值來確定如何加載程序集或以任何方式與它進行交互。