簡體   English   中英

強制應用程序使用可選的DLL運行

[英]Force application to run with optional DLL

我已經做了桌面應用程序。 我有制作類庫,然后從大學程序集制作其DLL。 現在我想使庫DLL成為可選的。 簡而言之,我想運行應用程序天氣或不引用庫DLL。

現在,如果我刪除了庫DLL的引用,那么它會給出未定義的庫方法錯誤。 我希望此應用程序運行,並給出庫方法錯誤。

我在Google上進行了搜索,但找不到任何可靠的答案。

檢查磁盤上是否存在程序集,如果是,請使用動態程序集加載:

http://msdn.microsoft.com/en-us/library/25y1ya39.aspx

庫中調用的類/方法可以用存根(新的抽象級別)代替,在存根中您可以檢查程序集是否已成功加載,如果是,則從中調用。

好的。非常簡單的示例:

“ Real Assembly”代碼(第一個項目,編譯為類庫“ RealAssembly.dll”):

namespace RealAssembly
{
    using System;
    public class RealClass
    {
        Random rand = new Random();

        public int SomeProperty { get { return rand.Next(); } }

        public string SomeMethod()
        {
            return "We used real library! Meow!";
        }
    }
}

具有Fake(stub)類的“我們的項目”代碼(第二個項目,編譯為控制台應用程序-“ ClientApp.exe”):

using System;
using System.IO;
using System.Reflection;

namespace ClientApp
{
    class FakeClass
    {
        public int SomeProperty { get { return 0; } }

        public string SomeMethod()
        {
            return "Library not exists, so we used stub! :)";
        }
    }

    class Program
    {
        // dynamic instance of Real or Fake class
        private static dynamic RealOfFakeObject;

        static void Main(string[] args)
        {
            TryLoadAssembly();
            Console.WriteLine(RealOfFakeObject.SomeMethod());
            Console.WriteLine(RealOfFakeObject.SomeProperty);
            Console.WriteLine("Press any key...");
            Console.ReadKey();
        }

        private static void TryLoadAssembly()
        {
            string assemblyFullName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RealAssembly.dll");

            if (File.Exists(assemblyFullName))
            {
                var RealAssembly = Assembly.LoadFrom(assemblyFullName);
                var RealClassType = RealAssembly.GetType("RealAssembly.RealClass");
                RealOfFakeObject = Activator.CreateInstance(RealClassType);
            }
            else
            {
                RealOfFakeObject = new FakeClass();
            }
        }
    }
}

這兩個項目沒有直接引用。 “系統”是在這兩個項目中使用的唯一參考。

因此,現在,如果在同一目錄中存在編譯的“ RealAssembly.dll”,我們將顯示“我們使用了實庫!喵!”。 控制台輸出處的字符串和隨機整數。 否則,如果同一目錄中不存在“ RealAssembly.dll”,則“庫不存在,因此我們使用了stub!:)”,將顯示0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM