Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
#1

Использование сторонней библиотеки

13.12.2016, 08:44. Просмотров 1790. Ответов 19
Метки нет (Все метки)

Добрый день. Есть библиотека, которая при попытке загрузить ее с помощью
C#
1
Assembly a = Assembly.LoadFrom(@"C:\Program Files (x86)\ATOL\Drivers8\Bin\FprnM1C.dll");
выдает ошибку "BadImageFormatException: Ожидалось, что модуль содержит манифест сборки".
Также пробовал делать так:
C#
1
2
[DllImport("FprnM1C.dll")]
public static extern void ShowProperties();
Но при вызове соответствующего метода появлялась ошибка "Не удается найти точку входа "ShowProperties" в DLL "FprnM1C.dll"".

Необходимо найти способ использовать свойства и методы со сторонней не С# библиотеки.

Уже не первый день ищу способы подключиться к сторонним библиотекам, на прошлые темы с похожим вопросом никто так и не ответил: Раз, Два
Также мне советовали использовать MEF, но я не могу понять, как с его помощью можно использовать сторонние библиотеки?

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2016, 08:44
Ответы с готовыми решениями:

Добавление сторонней библиотеки
Имеется VS 2010 Express. Скачал библиотеку taglib-sharp. Создал консольный...

Подключение сторонней библиотеки
Ребят, помогите разобраться, если в Delphi все решалось занесением названий...

Использование сторонней dll в своей библиотеке классов
Добрый день. Имеется библиотека VNE.dll, которую писал не я - см. вложение....

Не удалось загрузить файл или сборку сторонней библиотеки "ClosedXML"
Создал программу. На моем компьютере работает все, а на других нет. Требует...

Использование C++ библиотеки в C#
А что делать, если есть только dll библиотека на неуправляемом с++? Тогда ее...

19
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 08:50 #2
Leslov, что-то ты весь форум своими темами с этой библиотекой завалил.

Если библиотека нативная, то ни Assembly.LoadFrom ни MEF её не загрузят. Тут только использовать p\invoke (DllImport). Если ты получаешь сообщение, что нет точки входа, то это значит, что такой функции в библиотеке нет.
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 09:16  [ТС] #3
Usaga, а как с помощью
Цитата Сообщение от Usaga Посмотреть сообщение
p\invoke (DllImport)
обращаться к методам и свойствам?
Цитата Сообщение от Usaga Посмотреть сообщение
что-то ты весь форум своими темами с этой библиотекой завалил.
Так потому что проблема никуда не исчезла, такое чувство, что не умеют люди использовать внешние библиотеки динамически.
Цитата Сообщение от Usaga Посмотреть сообщение
Если ты получаешь сообщение, что нет точки входа, то это значит, что такой функции в библиотеке нет.
Точно знаю, что функция с таким названием есть, так как подключал библиотеку как ресурс и использовал ее.

Добавлено через 11 минут
Вот вырезка с метаданных:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Runtime.InteropServices;
 
namespace FprnM1C
{
    [Guid("E4795280-3564-11D4-8E97-0080C87C930A")]
    [TypeLibType(4160)]
    public interface IFprnM45 : IFprnMYZ
    {
        //...
        [DispId(20)]
        int ShowProperties();
        //...
    }
}
В шапке темы я обращался к "void ShowProperties()", ошибка, но даже исправив void на int ничего не изменилось. Полагаю, что мне нужно создать экземпляр класса. При использовании библиотеки как ресурс данный код вызывал окно настроек:
C#
1
2
FprnM1C.IFprnM45 ECR = new FprnM1C.FprnM45();
ECR.ShowProperties();
Мне нужно сделать то же самое, но с динамически загружаемой библиотекой.
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 09:21 #4
Leslov, у библиотеки нет методов и свойств - это элементы классов.

Цитата Сообщение от Leslov Посмотреть сообщение
Точно знаю, что функция с таким названием есть, так как подключал библиотеку как ресурс и использовал ее.
Где и как ты её использовал? Ты её сам написал? Если да, то имена функций могли быть "декорированы" (mangling).

Добавлено через 4 минуты
Так я не понял, библиотека - сборка C# или нативная?
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 09:24  [ТС] #5
Цитата Сообщение от Usaga Посмотреть сообщение
Где и как ты её использовал? Ты её сам написал?
Библиотека не моя. Вот пример ее использования:
C#
1
2
3
4
FprnM1C.IFprnM45 ECR = new FprnM1C.FprnM45();
ECR.RegisterNumber = 22;
ECR.GetRegister();
string SerialNumber=ECR.SerialNumber;
Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Так я не понял, библиотека - сборка C# или нативная?
Библиотека не является сборкой C#.
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 09:29 #6
Leslov, ну так это обычная сборка .NET, а не неуправляемая (нативная) библиотека. Её можно использовать через Assembly.Load или прямым подключением к проекту. Она под ту же архитектуру как твоё приложение?

Добавлено через 2 минуты
Цитата Сообщение от Leslov Посмотреть сообщение
Библиотека не является сборкой C#.
Ты не сможешь использовать нативную библиотеку тем способом, что ты выше привёл.
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 09:30  [ТС] #7
Цитата Сообщение от Usaga Посмотреть сообщение
Её можно использовать через Assembly.Load или прямым подключением к проекту.
Я в самом начале писал, что у меня не получилось использовать ее через Assembly.Load. Или может я что то не так сделал?
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 09:33 #8
Leslov, откуда были взяты сама библиотека и пример её использования? Что там о ней сказано? Под какую архитектуру оно собрано? Может есть исходники, чтобы пересобрать самому и не париться?
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 09:40  [ТС] #9
Usaga, исходников нет, мне нужно подтягивать библиотеку с драйверов каждый раз при запуске программы, т.к. для каждой версии драйверов своя dll, однако названия свойств и методов остаются неизменными.
Вот этот код я использовал при подключении библиотеки как ресурса. Все работает так, как и должно. Мне нужно сделать то же самое, но через позднее связывание.
Цитата Сообщение от Leslov Посмотреть сообщение
C#
1
2
3
4
FprnM1C.IFprnM45 ECR = new FprnM1C.FprnM45();
ECR.RegisterNumber = 22;
ECR.GetRegister();
string SerialNumber=ECR.SerialNumber;
Добавлено через 1 минуту
Вот насчет архитектуры:
Драйвер представляет собой внешнюю компоненту для системы «1С:Предприятие» и сервер
OLE Automation и ActiveX, работающий под управлением ОС Windows XP SP3 x86 / Vista x86 /
7 x86 / 7 x64 / 8 x86 / 8 x64. Он может использоваться в любых средах разработки
поддерживающих технологию OLE Automation:
 1C: Предприятие;
 Borland Delphi;
 Borland C++ Builder;
 Microsoft Visual C++;
 Microsoft Visual C#;
 Microsoft Visual FoxPro;
 Microsoft Visual Basic;
 Приложения Microsoft Office с VBA (Excel, Word, Access и др.);
 Navision Axapta и др.
Поддерживается работа с OPOS совместимым ПО (подробнее см. Приложение 12 на стр.
398).
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 09:50 #10
Leslov, гугл (как и фрагмент кода в твоём посте #5, который я невнимательно посмотрел) говорит о том, что эта библиотечка - COM-сервис. Его нельзя загружать вручную. Из C# по крайней мере.

Нужно запрашивать у ОС этот сервис по его идентификатору.
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 09:52  [ТС] #11
Usaga, спасибо. Видимо придется как-нибудь обойтись без позднего связывания.
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 09:55 #12
При подключении этой библиотеки "как ресурс" студия вытаскивает все необходимые метаданные из неё и засовывает в твою сборку, потому всё работает хорошо. Если нужно на ходу обращаться к разным сервисам, то на все эти сервисы нужно добавлять ссылки в твоём приложение. Я более чем уверен, что они (сервисы для разных версий драйвера) имеют общие интерфейсы и могут заменять друг друга.

Добавлено через 2 минуты
Если у тебя несколько таких библиотек, то добавляй их все в зависимости. Они будут загружаться только, когда (и если) ты к ним обращаешься. Так что избыточного потребления ресурсов не будет.
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 10:01  [ТС] #13
Цитата Сообщение от Usaga Посмотреть сообщение
Если у тебя несколько таких библиотек, то добавляй их все в зависимости. Они будут загружаться только, когда (и если) ты к ним обращаешься. Так что избыточного потребления ресурсов не будет.
Зато будет излишнее занимаемое место под каждую версию драйверов. Собственно ради решения этой проблемы я и начал изучать новую для себя тему позднего связывания.
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 10:03 #14
Цитата Сообщение от Leslov Посмотреть сообщение
Зато будет излишнее занимаемое место под каждую версию драйверов.
Ты не понял. Драйвера - одно, а метаданные в твоей сборке для подключения к COM-сервису (фасаду драйвера) - другое. Драйвера могу гигабайты занимать (допустим, это я утрирую), но метаданные весят копейки. Греть голову по этому поводу не стоит.
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 10:16  [ТС] #15
Usaga, видимо я действительно не понял. Что значит добавлять в зависимости?

Добавлено через 5 минут
В любом случае, спасибо за подробные объяснения и помощь.
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 10:19 #16
Цитата Сообщение от Leslov Посмотреть сообщение
Что значит добавлять в зависимости?
Добавить в Reference. "В ресурсы" в твоей терминологии.
1
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 10:23  [ТС] #17
Цитата Сообщение от Usaga Посмотреть сообщение
Добавить в Reference.
Но ведь для этого и придется таскать кучу dll за своей программой для каждой версии драйверов, в среднем по 1.3 МБ. По моему это глупо.
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 10:33 #18
Leslov, понадобятся только Interop-сборки. Да и то необязательно, ибо студия умеет для проектов 4.0+ импортировать метаданные из этих сборок.

Да даже, если и таскать. Какова "цена вопроса"? Пятьдесят мегабайт? Сто? 1С наверняка на порядки больше "весит". Да и кого сейчас таким размером напугать можно? Средняя игрушка под полсотни гигов занимает - и ничего.
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
13.12.2016, 10:45  [ТС] #19
Usaga, а что если сделать вот так:
Скомпилировать программу со всеми библиотеками разных версий, но при этом не вшивая их в проект, а ссылаясь на dll файл лежащий в папке с проектом. Затем, допустим, запускать программу (без исходников) на другом компьютере без этих всех библиотек. А перед попыткой обратиться к нужной версии dll, копировать ее с папки, в которой лежат драйвера устройства. Так выйдет?
0
Usaga
Эксперт .NET
4725 / 3127 / 564
Регистрация: 21.01.2016
Сообщений: 12,403
Завершенные тесты: 2
13.12.2016, 11:01 #20
Leslov, как я уже сказал ранее, твоя программа может и не тащить эти библиотеки. Посмотри в папке BIN. Если она там лежит, то попробуй удалить и запустить программу. Должно работать если для добавленной библиотеки в проекте выставлено свойство Embed Interop Types = True.

Так, что ничего копировать нет необходимости.
1
13.12.2016, 11:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2016, 11:01

Использование С++ библиотеки
Добрый вечер. Как создать экземпляр класса из библиотеки на плюсах в шарпе ?...

Использование библиотеки VkNet
Привет, не могу понять в чем причина ошибки. Хочу сделать пост на стену в вк,...

Использование файла библиотеки
Добрый день. Моя программа использует сторонний dll, актуальную версию которого...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru