Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > отслеживание отсутствия dll


Автор: TechnoMag 25.7.2012, 00:33
C#. Winforms.
В проекте в качестве зависимостей добавлены сторонние Dll. Проблема в том, что если в директории в которой находится исполняемый файл нет этих dll, то программа падает.
Как в коде программы предотвратить падение в случае отсутствия библиотек и выдать сообщение, что эти библиотеки отсутствуют?

Автор: erm0l0v 25.7.2012, 08:29
http://msdn.microsoft.com/ru-ru/library/system.appdomain.assemblyresolve.aspx

Автор: TechnoMag 28.7.2012, 02:32
Как это использовать?
Если я пишу:

Код

public class MyType
    {
        public MyType()
        {
            MessageBox.Show( "MyType instantiated!" );
        }
    }

    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            InstantiateMyTypeFail( currentDomain );
            currentDomain.AssemblyResolve += new ResolveEventHandler( MyResolveEventHandler );
            InstantiateMyTypeFail( currentDomain );
            InstantiateMyTypeSucceed( currentDomain );

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        private static void InstantiateMyTypeFail( AppDomain domain )
        {
            // Calling InstantiateMyType will always fail since the assembly info
            // given to CreateInstance is invalid.
            try
            {
                // You must supply a valid fully qualified assembly name here.
                domain.CreateInstance( "Assembly text name, Version, Culture, PublicKeyToken", "MyType" );
            }
            catch (Exception e)
            {
                MessageBox.Show( e.Message );
            }
        }

        private static void InstantiateMyTypeSucceed( AppDomain domain )
        {
            try
            {
                string asmname = Assembly.GetCallingAssembly().FullName;
                domain.CreateInstance( asmname, "MyType" );
            }
            catch (Exception e)
            {
                MessageBox.Show( e.Message );
            }
        }

        private static Assembly MyResolveEventHandler( object sender, ResolveEventArgs args )
        {
            MessageBox.Show( "Resolving..." );
            return typeof( MyType ).Assembly;
        }
    }


то все сообщения описанные тут в статических методах выводятся в любом случае, даже если dll находятся в папке с программой. Приложение все-равно падает в случае отсутствия dll.

Автор: mrbrooks 2.8.2012, 07:49
используй ленивую загрузку библиотек, а не через ссылки в студии. 

Автор: Figoro 5.10.2012, 15:39
Как вариант использовать при запуске приложение которое проверяет все зависимости а затем запускает основное приложение (Process.Start).
Так же можно сделать модульное приложение, или использовать Prism.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)