Force application to run with optional DLL

那年仲夏 提交于 2020-01-25 03:39:50

问题


I have made desktop application. I have make class library and then make its DLL from University assembly. Now i want to make library DLL optional. In short i want to run the application weather or not library DLL is refereed.

Right now if i remove reference of library DLL then it gives error on library methods that they are not defined. I want this application to run with oujt giving error of library method.

I have search on google but i am unable to find out any reliable answer.


回答1:


Check if assembly exists on disk, and if it's true use dynamic assembly loading:

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

Called classes/methods in your library can be replaced by stubs(new level of abstraction), in which you can check if assembly is successfully loaded, and invoke from it if yes.

Ok.. Very simple example:

"Real Assembly" code(First project, compiled as class library "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!";
        }
    }
}

"Our project" code with Fake(stub) class(Second project, compiled as Console applicaiton - "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();
            }
        }
    }
}

This two projects are not referenced directly. "System" is the only reference used in this two projects.

So now, if compiled "RealAssembly.dll" exists in same directory we will have "We used real library! Meow!" string and random integer at console output. Otherwise if "RealAssembly.dll" not exists in same directory - "Library not exists, so we used stub! :)" and 0 will be shown.



来源:https://stackoverflow.com/questions/22343052/force-application-to-run-with-optional-dll

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!