10 / 10 / 1
Регистрация: 22.12.2012
Сообщений: 508
1

Не подключается dll библиотека

14.01.2015, 16:42. Показов 3113. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!
Пишу мультиязычную программу. Для каждого языка создаю отдельную dll, что-бы ее можно было кинуть в папочку с прогой и прога сразу нашла новый язык, без всяких using <имя_библиотеки> в коде основной программы.
Для этого использую следущий код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            string programPath = Environment.CurrentDirectory;
            DirectoryInfo dir = new DirectoryInfo(programPath);
            FileInfo[] files = dir.GetFiles("*.dll");
            foreach (var item in files)
            {
                string str = item.Name;
                str = str.Split('.')[0];
                try
                {
                    Assembly asm = Assembly.Load(str);
                    Type T = asm.GetType(str + ".LangClass");
                    FieldInfo Str3 = T.GetField("language");
                    object obj = Activator.CreateInstance(T);
                    MessageBox.Show(Str3.GetValue(obj).ToString());
                }
                catch
                {
                    MessageBox.Show("Какой то сбой !!!");
                }
            }
В данном варианте он работает.
НО, если переместить dll-ку в другую папку и указать путь к этой папке
C#
1
2
string path = programPath + "\\Files\\Languages";
DirectoryInfo dir = new DirectoryInfo(path);
то в строке Assembly asm = Assembly.Load(str); вылетает исключение "Не удалось загрузить файл или сборку "UA" либо одну из их зависимостей. Не удается найти указанный файл.", хотя dll-ка в папке есть и переменная str сначала равна имени файла библиотеки "RU.dll", а после сплита "RU", чему собственно str и должна равняться.

Вопрос, почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2015, 16:42
Ответы с готовыми решениями:

Не подключается DLL библиотека (не распознается сборка)
Необходимо подключить длл в проект, но при подключении появляется ошибка: &quot;Please make sure that...

Не подключается библиотека
Доброго времени суток! Пытаюсь прикрепить к форме созданную библиотеку, но вылезает такая...

Не подключается библиотека SmallBasic.Library
Здравствуйте подскажите пожалуйста , пытаюсь разобраться в этом примере и почему-то не подключается...

Не подключается библиотека small basic в c#
Помогите пожалуйста!

11
123 / 123 / 72
Регистрация: 11.05.2014
Сообщений: 331
14.01.2015, 19:36 2
Попробуйте использовать Assembly.LoadFrom вместо Assembly.Load.
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
14.01.2015, 23:10 3
qwertun, почему ты не использвуешь стандартные механизмы локализации с использованием satellite assemblies с локализованными ресурсами? Windows Forms и WPF поддерживают это.
0
10 / 10 / 1
Регистрация: 22.12.2012
Сообщений: 508
15.01.2015, 00:22  [ТС] 4
Цитата Сообщение от OwenGlendower Посмотреть сообщение
почему ты не использвуешь стандартные механизмы локализации с использованием satellite assemblies с локализованными ресурсами?
потому-что первый раз о них слышу
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
15.01.2015, 00:42 5
Значит изучи их прежде чем писать собственную реализацию:
1
10 / 10 / 1
Регистрация: 22.12.2012
Сообщений: 508
15.01.2015, 11:48  [ТС] 6
Цитата Сообщение от Detect Посмотреть сообщение
Попробуйте использовать Assembly.LoadFrom вместо Assembly.Load.
теперь в
C#
1
FieldInfo Str3 = T.GetField("language");
исключение "Ссылка на объект не указывает на экземпляр объекта.", из-за того что Т равен null.
Если делать Assembly.LoadFile результат такой-же как и при Assembly.LoadFrom.

Добавлено через 4 минуты
OwenGlendower, мне не очень хочеться так делать потому-что каждый новый язык нада прописывать в коде программы, добавлять файлы ресурсов и тд и тп.
Я выбрал метод, который делаю, потому-что добавление нового языка не приведет к изменению кода самой программы, просто dll-ку кидаем в папку с прогой и всё, есть новый язык.

Добавлено через 12 минут
Detect, работает, спасибо, я просто немного зафейлил и в Type T = asm.GetType писал полный путь вместо имени сборки)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            string programPath = Environment.CurrentDirectory;
            string path = programPath + "\\Files\\Languages";
            DirectoryInfo dir = new DirectoryInfo(path);
            FileInfo[] files = dir.GetFiles("*.dll");
            foreach (var item in files)
            {
                string str = item.FullName;
                string str1 = item.Name;
                str1 = str1.Split('.')[0];
                try
                {
                    Assembly asm = Assembly.LoadFrom(str);
                    Type T = asm.GetType(str1 + ".LangClass");
                    FieldInfo Str3 = T.GetField("language");
                    object obj = Activator.CreateInstance(T);
                    MessageBox.Show(Str3.GetValue(obj).ToString());
                }
                catch
                {
                    MessageBox.Show("Какой то сбой !!!");
                }
            }
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
15.01.2015, 12:46 7
qwertun,
Цитата Сообщение от qwertun Посмотреть сообщение
Я выбрал метод, который делаю, потому-что добавление нового языка не приведет к изменению кода самой программы
Тебе виднее, но стандартный механизм локализации тоже не требует вносить изменения в код для поддержки нового языка.

Цитата Сообщение от qwertun Посмотреть сообщение
Detect, работает, спасибо
В приведенном примере советую заменить Environment.CurrentDirectory на AppDomain.CurrentDomain.BaseDirectory и использовать класс Path для работы с путями:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string programPath = AppDomain.CurrentDomain.BaseDirectory;
string path = Path.Combine(programPath, @"Files\Languages");
string[] files = Directory.GetFiles(path, "*.dll");
foreach (string dllPath in files)
{
    string name = Path.GetFileNameWithoutExtension(dllPath);
    try
    {
        Assembly asm = Assembly.LoadFrom(dllPath);
        Type T = asm.GetType(name + ".LangClass");
        FieldInfo Str3 = T.GetField("language");
        object obj = Activator.CreateInstance(T);
        MessageBox.Show(Str3.GetValue(obj).ToString());
    }
    catch
    {
        MessageBox.Show("Какой то сбой !!!");
    }
}
0
10 / 10 / 1
Регистрация: 22.12.2012
Сообщений: 508
15.01.2015, 13:40  [ТС] 8
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В приведенном примере советую заменить Environment.CurrentDirectory на AppDomain.CurrentDomain.BaseDirectory и использовать класс Path для работы с путями:
а зачем? чем оно лучше?
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
15.01.2015, 13:45 9
qwertun, тем что т.н. "текущий каталог" может указывать куда угодно, а AppDomain.CurrentDomain.BaseDirectory всегда указывает на папку приложения. Класс Path делает код более понятным и облегчает работу с путями.
0
10 / 10 / 1
Регистрация: 22.12.2012
Сообщений: 508
16.01.2015, 12:02  [ТС] 10
Цитата Сообщение от OwenGlendower Посмотреть сообщение
тем что т.н. "текущий каталог" может указывать куда угодно
ну хз, юзаю Environment.CurrentDirectory, и он всегда указывает на папку приложения
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
16.01.2015, 19:47 11
qwertun, вот несколько ситуаций когда CurrentDirectory будет указывать не на папку с программой:
  • При запуске через ярлык с измененным каталогом в поле "Start in"
  • Если другая программа будет запускать твою и указывать другой WorkingDirectory
  • При запуске через планировщик задач Windows
Список не полный. Кроме того При этом CurrentDirectory может еще меняться в течение сеанса работы програмы. AppDomain.CurrentDomain.BaseDirectory изменить нельзя и он всегда указывает на каталог программы.
1
10 / 10 / 1
Регистрация: 22.12.2012
Сообщений: 508
16.01.2015, 21:18  [ТС] 12
OwenGlendower, спасибо за информацию
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2015, 21:18
Помогаю со студенческими работами здесь

Библиотека Mail.NET не подключается к IMAP серверу через прокси
Всем здравствуйте. Кто-нибудь работал с библиотекой Mail.NET? Пишу программу, которая...

Не подключается dll. Директива using не работает
Скомпилировал длл, добавил ее в проект вместе с Xml файлом документации в след. папку Visual...

Не подключается dll/lib написанный на С++
Допустим у меня есть DLL проект(на C++) и в нем разумеется какой-то код. Проблема такая я...

Библиотека(dll)
Народ если что нибуть знает насчет библиотек как их добавлять как ими пользоваться и простейшие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru