强制应用程序与可选DLL一起运行

时间:2014-03-12 05:51:32

标签: c# .net dll

我已经制作了桌面应用程序。我已经制作了类库,然后从大学程序集中创建它的DLL。现在我想让库DLL可选。总之,我想运行应用程序天气或不库库DLL被审查。

现在,如果我删除库DLL的引用,那么它会给库方法带来错误,它们没有被定义。我希望这个应用程序运行oujt给出库方法的错误。

我在google上搜索但我无法找到任何可靠的答案。

1 个答案:

答案 0 :(得分:2)

检查磁盘上是否存在汇编,如果是,则使用动态汇编加载:

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!";
        }
    }
}

“我们的项目”代码与假(存根)类(第二个项目,编译为控制台应用程序 - “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。