12

C# アプリケーションから GAC をアンインストールするにはどうすればよいですか。

GAC から特定の exe と DLL をアンインストールできません。

C# で GAC をアンインストールする適切な方法ですか?

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;
}
4

7 に答える 7

2

DLL がこのコードの実行元と同じディレクトリにあると仮定して、次のことを試してください。

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);
}

これが誰かに役立つことを願っています...

于 2014-01-14T05:14:41.960 に答える
1

なぜあなたはそれをしたいのですか?GAC はグローバル アセンブリ キャッシュです。基本的には、PC の共有 DLL を含むシステム フォルダーです。

とにかくアセンブリを削除したい場合は、ここで gacutil のドキュメントを確認してください: http://msdn.microsoft.com/en-us/library/ex0ss12c(v=vs.71).aspx ただし、すべてのプロジェクトで削除されます!

于 2012-09-05T09:36:01.920 に答える
1

その dll を使用している他のアプリケーションに問題を引き起こす可能性があるため、実行しないことをお勧めします。しかし、それはあなた自身のものだと思うので、比較的安全です。

次のコードを使用して、GAC から dll を削除します。アセンブリ名は、拡張子を除いた dll の名前です。

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;
}
于 2012-11-18T13:20:46.967 に答える
1

次の手順に従ってください:-

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;

} 
} 

Assembly クラスの LoadFrom() メソッドを使用してアセンブリ ファイルをロードすることもできますが、それを使用するのは適切ではありません。理由については、こちらの記事を参照してください。

assemblyFullPath を取得したら、GAC からアセンブリをアンインストール/削除するのは簡単です。System.EnterpriseServices.Internal 名前空間は、GAC ファイルをインストールまたは削除するメソッドを提供します。以下の手順に従って、ファイルをインストール/削除します。

  1. プロジェクトに System.EnterpriseServices.dll への参照を追加します。
  2. System.EnterpriseServices.Internal を使用して追加します。使用セクションの最後に。
  3. assemblyFullPath を使用して、アセンブリ ファイルを削除するメソッドに以下のコード行を追加します。

    パブリッシュ publishProcess = new Publish(); publishProcess.GacRemove(assemblyFullPath);

それがあなたを助けることを願っています

于 2012-09-07T09:41:16.190 に答える
0

Visual C# でグローバル アセンブリ キャッシュにアセンブリをインストールする方法:

Microsoft サポート記事の解決策は次のとおりです: http://support.microsoft.com/kb/815808

別のリンク (GAC からのライブラリの登録、登録解除): http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7d3165cf-ca3b-43cc-8f77-a46dbf38f13d/

于 2012-09-18T23:26:10.997 に答える
0

アプリケーションから「gacutil /u」を呼び出してみませんか?または、何か不足していますか?

于 2012-10-28T15:25:24.013 に答える
0

プログラムで実行する方法の詳細については、.NET 参照コードを参照してください (ただし、参照サイトのライセンスにより、独自のソフトウェアでの使用が制限されます。つまり、このコードをコピーして貼り付けることはお勧めできません)。

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

(下にスクロールして public bool GacUnInstall(string assemblyName))

こちらもご覧ください

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

GetAssemblyCache のネイティブ メソッド

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

一方、コードはアセンブリ System.Web にあり、クラスは internal としてマークされているため、リフレクションを使用してアクセスできます。見る

Reflection を使用して内部クラスにアクセスする方法

于 2014-10-08T01:53:45.580 に答える