2012-06-20 23 views
12

Làm cách nào để gỡ cài đặt GAC khỏi ứng dụng C# của tôi.Gỡ cài đặt từ GAC Trong C# code

Tôi không thể gỡ cài đặt, exe cụ thể và DLL từ GAC.

Đây có phải là cách thích hợp để gỡ cài đặt GAC trong C# không?

public void RemoveAssembly(string ShortAssemblyName, string PublicToken) 
{ 
    AssemblyCacheEnum AssembCache = new AssemblyCacheEnum(null); 

    string FullAssembName = null; 

    for (; ;) 
    { 
     string AssembNameLoc = AssembCache.GetNextAssembly(); 
     if (AssembNameLoc == null) 
      break; 

     string Pt; 
     string ShortName = GetAssemblyShortName(AssembNameLoc, out Pt); 

     if (ShortAssemblyName == ShortName) 
     { 

      if (PublicToken != null) 
      { 
       PublicToken = PublicToken.Trim().ToLower(); 
       if (Pt == null) 
       { 
        FullAssembName = AssembNameLoc; 
        break; 
       } 

       Pt = Pt.ToLower().Trim(); 

       if (PublicToken == Pt) 
       { 
        FullAssembName = AssembNameLoc; 
        break; 
       } 
      } 
      else 
      { 
       FullAssembName = AssembNameLoc; 
       break; 
      } 
     } 
    } 

    string Stoken = "null"; 
    if (PublicToken != null) 
    { 
     Stoken = PublicToken; 
    } 

    if (FullAssembName == null) 
     throw new Exception("Assembly=" + ShortAssemblyName + ",PublicToken=" + 
     token + " not found in GAC"); 

    AssemblyCacheUninstallDisposition UninstDisp; 


    AssemblyCache.UninstallAssembly(FullAssembName, null, out UninstDisp); 
} 


public static void UninstallAssembly(String assemblyName, InstallReference reference, out AssemblyCacheUninstallDisposition disp) 
{ 
    AssemblyCacheUninstallDisposition dispResult = AssemblyCacheUninstallDisposition.Uninstalled; 
    if (reference != null) 
    { 
     if (!InstallReferenceGuid.IsValidGuidScheme(reference.GuidScheme)) 
      throw new ArgumentException("Invalid reference guid.", "guid"); 
    } 

    IAssemblyCache ac = null; 

    int hr = Utils.CreateAssemblyCache(out ac, 0); 
    if (hr >= 0) 
    { 
     hr = ac.UninstallAssembly(0, assemblyName, reference, out dispResult); 
    } 

    if (hr < 0) 
    { 
     Marshal.ThrowExceptionForHR(hr); 
    } 

    disp = dispResult; 
} 
+0

bạn sẽ xem xét hủy đăng ký theo lớp Process? – Talha

+8

Xem http://stackoverflow.com/a/2611435/17034 –

+3

["Mã nguồn C#: Lập trình bổ sung và loại bỏ các hội đồng từ GAC (không sử dụng GACUTIL)"] (http://www.vbusers.com/codecsharp/ CodeID = 65 & PostID = 1) –

Trả lời

1

Tại sao bạn muốn làm điều đó? GAC là Global Assembly Cache, cơ bản là thư mục hệ thống chứa tệp DLL được chia sẻ trên PC của bạn.

Nếu bạn muốn gỡ bỏ lắp ráp, hãy kiểm tra tài liệu gacutil tại đây: http://msdn.microsoft.com/en-us/library/ex0ss12c(v=vs.71).aspx Nhưng nó sẽ bị xóa cho tất cả các dự án của bạn!

1

Làm theo các bước này: -

using System; 
using System.Reflection; 
private string assemblyFullPath = ""; 
public class myAssembly 
{ 
static void Main() 
{ 
Assembly assembly = Assembly.Load("library, version=1.0.0.0, culture=neutral, PublicKeyToken=9b184fc90fb9648d"); 
assemblyFullPath = assembly.Location; 

} 
} 

Bạn cũng có thể tải các tập tin lắp ráp với LoadFrom() phương pháp của lớp hội nhưng nó không phải là tốt để sử dụng nó, bạn có thể đọc bài theo đây biết lý do.

Khi chúng tôi có assemblyFullPath, bạn có thể dễ dàng gỡ cài đặt/tháo lắp ráp khỏi GAC. Không gian tên System.EnterpriseServices.Internal cung cấp các phương thức để cài đặt hoặc xóa các tệp GAC. Làm theo các bước dưới đây để thực hiện cài đặt/xóa các tệp:

  1. Thêm tham chiếu vào System.EnterpriseServices.dll trong dự án của bạn.
  2. Thêm bằng cách sử dụng System.EnterpriseServices.Internal; ở cuối phần sử dụng.
  3. Bây giờ với assemblyFullPath, thêm các dòng mã dưới đây vào phương pháp của bạn nơi bạn muốn loại bỏ các tệp lắp ráp.

    Xuất bản xuất bảnProcess = new Publish(); publishProcess.GacRemove (assemblyFullPath);

hy vọng nó sẽ giúp bạn

0

Làm thế nào để cài đặt một assembly vào Global Assembly Cache trong Visual C#:

Dưới đây là giải pháp từ bài viết hỗ trợ của Microsoft: http://support.microsoft.com/kb/815808

Một liên kết (đăng ký, hủy đăng ký thư viện từ GAC): http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7d3165cf-ca3b-43cc-8f77-a46dbf38f13d/

+0

Vấn đề là về unistalling không cài đặt. –

+0

Liên kết msdn có mã để cài đặt và gỡ cài đặt. –

0

Tại sao bạn không gọi "gacutil/u" từ ứng dụng? Hay tôi đang thiếu một cái gì đó?

1

Bạn nên không làm điều đó vì nó có thể gây ra sự cố cho các ứng dụng khác bằng cách sử dụng dll đó. Nhưng tôi cho rằng đó là của riêng bạn, vì vậy nó tương đối an toàn.

Sử dụng mã tiếp theo để xóa dll khỏi GAC của bạn. Tên asssembly là tên của dll của bạn mà không có phần mở rộng.

public static void UninstallAssembly(string assemblyName) { 
    ProcessStartInfo processStartInfo = new ProcessStartInfo("gacutil.exe", 
     string.Format("/u {0}.dll", assemblyName)); 

    processStartInfo.UseShellExecute = false; 
    Process process = Process.Start(processStartInfo); 
    process.WaitForExit; 
} 
+0

Gacutil.exe chỉ dành cho mục đích phát triển và không nên được sử dụng để cài đặt các cụm sản xuất vào bộ nhớ cache lắp ráp chung. Xem MSDN để biết thêm http://msdn.microsoft.com/en-us/library/dkkx7f79(v=vs.110).aspx – bartonm

+0

Câu hỏi không phải là cách cài đặt các assembly vào GAC, mà là cách gỡ bỏ chúng. –

2

Giả sử các DLL nằm trong thư mục tương tự như nơi mã này đang chạy từ, hãy thử:

ArrayList libraries = new ArrayList(); 
libraries.Add("somedll1.dll"); 
libraries.Add("somedll2.dll"); 

Console.WriteLine("Registering DDLs in the Gac"); 

try 
{ 
    for (int i = 0; i < libraries.Count; i++) 
    { 
     // get the path from the running exe, and remove the running exe's name from it 
     new System.EnterpriseServices.Internal.Publish().GacRemove(System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("ThisUtilitiesName.exe", "") + libraries[i]); 
    } 

    Console.WriteLine("Completed task successfully"); 
} 
catch (Exception exp) 
{ 
    Console.WriteLine(exp.Message); 
} 

Hy vọng điều này sẽ giúp người ...

0

Bạn có thể xem tài liệu tham khảo NET mã để biết chi tiết về cách nó có thể thực hiện theo chương trình (mặc dù giấy phép cho trang web tham chiếu sẽ hạn chế bạn sử dụng nó trong phần mềm của riêng bạn, tức là sao chép mã này không phải là ý hay).

http://referencesource.microsoft.com/#System.Web/xsp/system/Web/Configuration/GacUtil.cs

(di chuyển xuống bool GacUnInstall công cộng (string AssemblyName))

cũng Xem IAssemblyCache

http://referencesource.microsoft.com/#System.Web/xsp/system/Web/Configuration/IAssemblyCache.cs

và các phương pháp tự nhiên cho GetAssemblyCache

http://referencesource.microsoft.com/#System.Web/xsp/system/Web/NativeMethods.cs

Mặt khác, vì mã được lắp ráp System.Web và lớp được đánh dấu là nội bộ, bạn có thể sử dụng phản chiếu để truy cập nó. Xem

How to access internal class using Reflection

Các vấn đề liên quan