Я сделал настольное приложение. Я сделал библиотеку классов, а затем сделал ее DLL из университетской сборки. Теперь я хочу сделать библиотеку DLL необязательной. Короче я хочу запустить приложение погоды или нет библиотеки DLL.

Прямо сейчас, если я удалю ссылку на библиотеку DLL, это даст ошибку в методах библиотеки, которые они не определены. Я хочу, чтобы это приложение запускалось с ошибкой библиотечного метода.

У меня есть поиск в Google, но я не могу найти надежного ответа.

1
Muneem Habib 12 Мар 2014 в 09:51
Нет, это не дубликат. Я хочу запустить приложение без ссылки на DLL.
 – 
Muneem Habib
12 Мар 2014 в 09:56
Я не вижу здесь смысла. Если вы вызываете методы из внешней DLL, вам следует обратиться к ней. Что вы ожидаете от компилятора? Игнорировать вопиющие ошибки?
 – 
danish
12 Мар 2014 в 11:27

1 ответ

Лучший ответ

Проверьте, существует ли сборка на диске, и если это правда, используйте динамическую загрузку сборки:

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

Вызываемые классы / методы в вашей библиотеке могут быть заменены заглушками (новый уровень абстракции), в которых вы можете проверить, успешно ли загружена сборка, и вызвать из нее, если да.

Хорошо .. Очень простой пример:

Код "Реальной сборки" (Первый проект, скомпилированный как библиотека классов "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 (заглушкой) классом (Второй проект, скомпилированный как Консольное приложение - «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 не существует в том же каталоге - «Библиотеки не существует, поэтому мы использовали заглушку! :)» и будет отображаться 0.

2
rufanov 12 Мар 2014 в 11:35
Спасибо за ответ. Но я хочу, чтобы я не ссылался на сборку, и мое приложение не выдает ошибок.
 – 
Muneem Habib
12 Мар 2014 в 10:12
Это способ сделать это. Вам не нужно ссылаться на сборку непосредственно в «ссылках» проекта - вместо этого вам нужно проверить свой код во время выполнения, существует ли сборка «dll» где-то на диске и существует ли она (или, например, после того, как пользователь нажал кнопку «Загрузить университет» "Библиотека") - загрузить. Если библиотеки не существует - код будет использовать новые классы (должны быть написаны), которые будут вызывать код из динамически загружаемой сборки, если она загружена. Если хотите, могу показать простой пример ..
 – 
rufanov
12 Мар 2014 в 10:20
Но если DLL не существует, она не должна выдавать ошибку
 – 
Muneem Habib
12 Мар 2014 в 10:24
Ага. похоже, что я почти получил ответ. но мне нужна твоя помощь на последнем этапе. Метод Assembly.loadfrom выдает ошибку, если не может найти сборку. есть ли способ вернуть null, если он не смог найти сборку
 – 
Muneem Habib
12 Мар 2014 в 11:27
Да. Только не вызывайте, если файл сборки не найден! :) Я использовал метод "File.Exists" для проверки этой ситуации. После того, как вы проверите, существует ли эта сборочная DLL или нет, вы можете делать все, что хотите ...
 – 
rufanov
12 Мар 2014 в 11:32