天天看點

C# 動态加載解除安裝 DLL

我最近做的軟體,需要檢測dll或exe是否混淆,需要反射獲得類名,這時發現,C#可以加載DLL,但不能解除安裝DLL。于是在網上找到一個方法,可以動态加載DLL,不使用時可以解除安裝。

我在寫一個WPF 程式,發現可以通過

Assembly.Load

加載 DLL,但是如何解除安裝DLL?下面就來說下如何解除安裝。

看到

Assembly.Load

是把 DLL 加載到目前程式集,這句話,我就想到了我們的主程式集和目前的不同,那麼可以加載到目前不會影響主程式。那麼如何建立一個程式集?他是否可以解除安裝,答案是可以的。

首先,我們可以通過

var appDomain = AppDomain.CreateDomain(appDomainName);

建立 AppDomain 。他是可以解除安裝,解除安裝 AppDomain 使用

AppDomain.Unload

,就可以把加載在 AppDomain 的 DLL 解除安裝。

于是我們需要把 DLL 加載在 AppDomain ,這樣之後可以解除安裝 AppDomain 動态删掉 加載的DLL。

如果要把 DLL 加載在 AppDomain 需要先寫一個類,繼承

MarshalByRefObject

internal class ApplicationProxy : MarshalByRefObject
    {
        public void DoSomething()
        {

        }
    }

    var proxy =
                appDomain.CreateInstanceAndUnwrap(Assembly.GetAssembly(typeof(ApplicationProxy)).FullName,
                typeof(ApplicationProxy).ToString()) as ApplicationProxy;           

我們可以在 DoSomething 函數加載 DLL ,加載的 DLL 在 AppDomain ,不在主程式,是以解除安裝 AppDomain 可以解除安裝 DLL

假如是從 檔案加載,可以使用 LoadFile

var assembly  = Assembly.LoadFile(file.FullName);           

assembly 可以獲得所有的類和方法。

然後需要解除安裝時,可以使用

AppDomain.Unload(appDomain);

建議寫

var assembly = Assembly.LoadFile(file.FullName);

在 try,寫

AppDomain.Unload(appDomain);

在 finally

上面的 appDomainName 是我自己給他的。

http://stackoverflow.com/questions/2132649/loading-unloading-assembly-in-different-appdomain

我們可以驗證,如果不使用建立一個 AppDomain 加載的 DLL 會在主程式集,如果使用了,就會在我們建立的 AppDomain 。

首先我們使用

Assembly.LoadFile(file)

加載,再用反射獲得目前程式集,然後擷取他的所有 type ,當然我們是知道加載的 File 包含的 type,一會可以驗證使用已經加載他。

System.Reflection.Assembly.LoadFile(file);

            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                //檢視type               
            }           

可以看到 file 包含的 type 在主程式。

我們使用建立 appDomain

const string appDomainName = "ConfuseChecker";
            var appDomain = AppDomain.CreateDomain(appDomainName);
            var proxy =
                       appDomain.CreateInstanceAndUnwrap(Assembly.GetAssembly(typeof(ApplicationProxy)).FullName,
                           typeof(ApplicationProxy).ToString()) as ApplicationProxy;
            proxy.DoSomething(new FileInfo(file));

            AppDomain.Unload(appDomain);           

這時可以看到,我們的主程式沒有包含 file 的 type 。

C# 動态加載解除安裝 DLL

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯系。

部落格園部落格隻做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/

C# 動态加載解除安裝 DLL

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯系](mailto:[email protected])。