Запустить exe даже с отсутствующими зависимостями dll? - PullRequest
6 голосов
/ 18 декабря 2010

В Dotnet2.0 и более поздних версиях программа отказывается запускаться, если отсутствует один из ее зависимых (статически привязанных) dll.

При использовании Dotnet1.1 и 1.0 программа запускалась, но позже вылетала при попытке использовать функциональностьотсутствующей сборки.

Интересно, есть ли что-то вроде

  • переключателя компилятора,
  • опция конфигурации или
  • атрибут dotnet []

, чтобы разрешить мне запускать приложение, когда отсутствуют определенные библиотеки.

Возможно ли это без изменения исходного кода (кроме применения некоторых атрибутов)?

Я не хочу загружать сборки вручную с помощью программного кода или использовать IOC-Framworks.

Обновление: под "статическими ссылочными библиотеками" я подразумеваю противоположность динамической загрузки библиотеки DLL в свой собственный программный код с использованием отражений и Assembly.Loadxxxx().

Обновление 2010-12-25 Я думал, что сложно.Спасибо простое решение от @erinus:

Мне просто нужно попробовать попробовать поймать и все заработало:

    using System;
    using System.IO;
    using log4net; // log4net.dll might be missing

    namespace ConsoleAppWithMissingDll
    {
        class Program
        {
            static bool dllIsInstalled = true;
            static void Main(string[] args)
            {
                Console.WriteLine("Hello missing dll");

                try
                {
                    OutputViaLog4Net("hello log4net");
                }
                catch (FileNotFoundException)
                {
                    dllIsInstalled = false;
                    Console.WriteLine("Log4net-dll not found");
                }
                Console.WriteLine("Program continued");
    #if DEBUG
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
    #endif
            }

            private static void OutputViaLog4Net(string message)
            {

                ILog logger = LogManager.GetLogger("MyLogger");

                logger.Debug(message);

            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

«dll со статической ссылкой» - оксюморон, d в dll означает «динамический». Существуют неявно ссылающиеся библиотеки DLL, но их использует только неуправляемый код. Вы не можете запустить программу с такой отсутствующей DLL, DLL загружается до начала выполнения точки входа программы.

.NET загружает библиотеки по запросу, запускаемые компилятором JIT. Как только он скомпилирует метод типа, который хранится в этой DLL, DLL будет загружена. Доставка кода с такой отсутствующей DLL технически возможна, вы должны быть осторожны при написании кода, чтобы тип из такой DLL никогда не использовался. Это поведение настольной версии, не совсем уверенное, работает ли CF-версия таким же образом.

1 голос
/ 25 декабря 2010

Использовать неуправляемый код. Вызовите API Windows: LoadLibrary в блоке try {...} catch {...}. Если dll отсутствует, обработайте исключение и продолжайте процесс.

...