2010-07-28 3 views
12

में प्रदर्शित करें तो मेरे पास एक फ़ोल्डर में डीएल की एक सूची होगी, मैं एक आवेदन के लिए एक डीएल जांचना चाहता हूं या नहीं। यदि ऐसा है तो मैं उस एप्लिकेशन का नाम ग्रिड में जोड़ना चाहता हूं। क्या कोई इसे प्रोग्रामेटिक तरीके से कैसे करना है। अग्रिम में धन्यवादप्रोग्रामेटिक रूप से डीएसी की जांच करने के लिए जीएसी में मौजूद है या नहीं। अगर इसे ग्रिड

+3

यदि आपके पास किसी फ़ोल्डर में डीएलएल की एक सूची है, तो यह बहुत ही असंभव है कि फ़ोल्डर जीएसी का हिस्सा बनता है। –

उत्तर

3

यहां अनियंत्रित जीएसी एपीआई के लिए प्रलेखन है: DOC: Global Assembly Cache (GAC) APIs Are Not Documented in the .NET Framework Software Development Kit (SDK) Documentation

यह एपीआई मूल कोड से उपयोग करने के लिए डिज़ाइन किया गया है, इसलिए this article आपको इसे C# से प्रोग्राम करने में मदद कर सकता है।

यदि आप त्वरित समाधान के बाद हैं, gacutil /l काम करता है।

+5

+1 एक अनियंत्रित एपीआई पर दस्तावेज प्रदान करने के लिए +1 ... – Achilles

0

आम तौर पर लोग यह मानते हैं कि जीएसी सी: \\ असेंबली में स्थित है, जो 99% सच है। तो आप उस फ़ोल्डर में मिली फ़ाइलों के माध्यम से कोड को फिर से लिखने के लिए लिख सकते हैं।

अधिक रूढ़िवादी तरीका फ़्यूज़न एपीआई का उपयोग करना होगा, जो COM-आधारित है। एक प्रबंधित आवरण इस ब्लॉग साइट पर उपलब्ध है:

http://blogs.msdn.com/junfeng/archive/2004/09/14/229653.aspx

साइट भी शामिल नमूना कामयाब कैसे स्थापित विधानसभाओं की गणना करने में फ्यूजन एपीआई का उपयोग करने दिखा कोड - कोड काफी आप के लिए बाहर लिखा है, तो बस CTRL + C और फिर Ctrl + V ... :)

http://blogs.msdn.com/b/junfeng/archive/2004/09/14/229650.aspx

HTH ...

9

मुझे लगता है कि उचित तरीके से फ्यूजन COM एपीआई है।

इसका इस्तेमाल करने के लिए:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace IsAssemblyInGAC 
{ 
    internal class GacApi 
    { 
     [DllImport("fusion.dll")] 
     internal static extern IntPtr CreateAssemblyCache(
      out IAssemblyCache ppAsmCache, int reserved); 
    } 

    // GAC Interfaces - IAssemblyCache. As a sample, non used vtable entries  
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), 
    Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")] 
    internal interface IAssemblyCache 
    { 
     int Dummy1(); 
     [PreserveSig()] 
     IntPtr QueryAssemblyInfo(
      int flags, 
      [MarshalAs(UnmanagedType.LPWStr)] 
      String assemblyName, 
      ref ASSEMBLY_INFO assemblyInfo); 

     int Dummy2(); 
     int Dummy3(); 
     int Dummy4(); 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    internal struct ASSEMBLY_INFO 
    { 
     public int cbAssemblyInfo; 
     public int assemblyFlags; 
     public long assemblySizeInKB; 

     [MarshalAs(UnmanagedType.LPWStr)] 
     public String currentAssemblyPath; 

     public int cchBuf; 
    } 

    class Program 
    { 
     static void Main() 
     { 
      try 
      { 
       Console.WriteLine(QueryAssemblyInfo("System")); 
      } 
      catch(System.IO.FileNotFoundException e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 

     // If assemblyName is not fully qualified, a random matching may be 
     public static String QueryAssemblyInfo(String assemblyName) 
     { 
      ASSEMBLY_INFO assembyInfo = new ASSEMBLY_INFO(); 
      assembyInfo.cchBuf = 512; 
      assembyInfo.currentAssemblyPath = new String('\0', 
       assembyInfo.cchBuf) ; 

      IAssemblyCache assemblyCache = null; 

      // Get IAssemblyCache pointer 
      IntPtr hr = GacApi.CreateAssemblyCache(out assemblyCache, 0); 
      if (hr == IntPtr.Zero) 
      { 
       hr = assemblyCache.QueryAssemblyInfo(1, assemblyName, ref assembyInfo); 
       if (hr != IntPtr.Zero) 
       { 
        Marshal.ThrowExceptionForHR(hr.ToInt32()); 
       } 
      } 
      else 
      { 
       Marshal.ThrowExceptionForHR(hr.ToInt32()); 
      } 
      return assembyInfo.currentAssemblyPath; 
     } 
    } 
} 

उपयोग QueryAssemblyInfo विधि।

+0

HRESULT को 32 बिट पूर्णांक के रूप में परिभाषित किया गया है, इसलिए CreateAssemblyCache और QueryAssemblyInfo को IntPtr की बजाय int वापस करना चाहिए। –

+0

'डमी 1() ',' डमी 2()' ... के लिए क्या हैं? – BanksySan

12

एक Assembly.LoadFrom करो और जाँच GlobalAssemblyCache

testAssembly = Assembly.LoadFrom(dllname); 

if (!testAssembly.GlobalAssemblyCache) 
{ 
    // not in gac 
} 
+0

डाउनवोट क्यों? – dvallejo

+0

मुझे डाउनवोट के लिए कोई कारण नहीं दिखता है। मेरे लिए, यह अब तक का सबसे सुंदर जवाब जैसा प्रतीत होता है, क्योंकि इसे फ़्यूज़न/COM के साथ जटिल सामग्री की आवश्यकता नहीं है। यह भी काम करना चाहिए यदि आप [प्रतिबिंब-केवल संदर्भ] में असेंबली लोड कर रहे हैं (http://msdn.microsoft.com/en-us/library/ms172331.aspx) – derabbink

0

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन नए यात्रियों की खातिर ...

हम के लिए एक (मुक्त) संलयन पुस्तकालय उपलब्ध है पर डाउनलोड करें जो वास्तव में यह करता है। प्रकटीकरण: हां, मैं संबद्ध हूं। नहीं, अगर आप डाउनलोड करते हैं तो मुझे पैसे नहीं मिलेंगे। ;-)

संबंधित मुद्दे