Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/67: Рейтинг темы: голосов - 67, средняя оценка - 4.90
23 / 21 / 4
Регистрация: 03.11.2010
Сообщений: 169
1

Как добавить в проект DLL, написанную на C++

13.11.2012, 00:26. Показов 13487. Ответов 58
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добавил в проект свою DLL написанную на C++, как ее теперь использовать?
using имя_dll не работает.

Добавлено через 6 минут
Через "Проект" -> "Добавить ссылку" не добавляется. Почему?

Добавлено через 2 минуты
Пересобрал dll с включенным CLR, добавилась как ссылка. Дописал using имя_dll, ошибки:
Ошибка 1 Директива использования пространства имен может применяться только для пространств имен; "Ocean" является типом, а не пространством имен
Ошибка 2 "Ocean" недоступен в силу его уровня защиты
Предупреждение 3 Несоответствие между архитектурой процессора проекта "MSIL", построение которого выполняется, и архитектурой процессора ссылки "Ocean", "x86". Это несоответствие может привести к ошибкам во время выполнения. Попробуйте изменить целевую архитектуру процессора для проекта с помощью диспетчера конфигураций, чтобы согласовать архитектуры процессоров для проекта и ссылок, или используйте зависимость от ссылок с архитектурой процессора, соответствующей целевой архитектуре процессора проекта.
Ошибка 4 Не удалось найти имя типа или пространства имен "Ocean" (пропущена директива using или ссылка на сборку?)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2012, 00:26
Ответы с готовыми решениями:

Как добавить Timer в ActiveX.dll проект?
?

Как подключить dll, написанную на C, к dll на Delphi
Добрый день! Нужно подключить dll написанную на C к dll на Delphi. Как это можно сделать и можно ли...

Как добавить Microsoft.Speech.dll в проект Unity?
Не знаю как добавить ссылку на Microsoft.Speech.dll в C# скрипт для unity. В visual studio...

Как добавить Microsoft.Speech.dll в проект Unity?
Не знаю как добавить ссылку на Microsoft.Speech.dll в C# скрипт для unity. В visual studio...

58
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
16.06.2015, 17:03 41
Author24 — интернет-сервис помощи студентам
Ну я тупой! Читать разучился, наверное. Конечно, когда я изменил область видимости, тут же и сработало! Выдаёт цифру 33 в качестве результата.
Теперь понять бы что надо написать в качестве аргумента функции CH341OpenDevice(ххх) и CH341CloseDevice(ххх)?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
16.06.2015, 17:06 42
Цитата Сообщение от mpetrovich Посмотреть сообщение
Теперь понять бы что надо написать в качестве аргумента функции CH341OpenDevice(ххх) и CH341CloseDevice(ххх)?
Цитата Сообщение от NickoTin Посмотреть сообщение
Описание прототипов функций лежит в .\LIB\C\CH341DLL.H
Да на китайском, но гугл транслейт нормально с ним справляется.
1
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
16.06.2015, 18:43 43
А я никак не мог понять что за хрень вылазит в блокноте при просмотре файла .\LIB\C\CH341DLL.H!
Надо было его в Worde конвертнуть и тогда жучки китайские повываливались. Во как... Век живи - век учись и всё равно дураком помрёшь, однако.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
22.06.2015, 10:57 44
Продолжил в выходные мучить свою железку. Пытался оживить прочие функции, описанные в \LIB\C\CH341DLL.H. Однако затыка вышла на функции
C
1
2
3
4
BOOL    WINAPI CH341GetDeviceDescr(  // Читает дескриптор устройства 
    ULONG           iIndex,  // Определяет номер устройства CH341 
    PVOID           oBuffer,  // Точка в буфере достаточно большом, чтобы содержать дескриптор
    PULONG          ioLength );  // Когда точка входа длина единичной длины готова считать после возвращается фактически читают длина
Это перевод гуглопереводчика с китайского, оттого и выглядит так... необычно. Я не смог понять каким образом конвертировать типы PVOID и PULONG для С#. Если я правильно понимаю, то PVOID oBuffer - это указатель на какую-то память, а PULONG ioLength - количество байт в дескрипторе. Как переписать это выражение в С#?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
22.06.2015, 11:44 45
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[DllImport("...")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static bool CH341GetDeviceDescr(
    uint iIndex,
    byte[] oBuffer,
    ref int ioLength
    );
 
// либо
 
[DllImport("...")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static bool CH341GetDeviceDescr(
    uint iIndex,
    IntPtr oBuffer,
    ref int ioLength
    );
 
// в зависимости от того как память выделяете/как удобней работать
p.s. Я бы переводил с китайского на английский, более адекватный перевод, имхо..
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
23.06.2015, 00:00 46
А вместо многоточия
C#
1
[DllImport("...")]
, если я правильно понял, вставляем название функции CH341GetDeviceDescr?
Если не в тягость, разъясните пожалуйста поподробнее смысл действий.

Добавлено через 2 часа 57 минут
Извиняюсь. Прочитал своё сообщение и понял, что второпях написал не то. Вместо многоточия надо вставить CH341DLL.dll

Добавлено через 9 часов 9 минут
Вариант с
C#
1
2
3
4
5
6
7
[DllImport("CH34DLL.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static bool CH341GetDeviceDescr(
    uint iIndex,
    IntPtr oBuffer,
    ref int ioLength
    );
у меня не пошёл. Выдаёт ошибку, что попытка чтения.записи в защищённую память.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.06.2015, 03:35 47
Цитата Сообщение от mpetrovich Посмотреть сообщение
Выдаёт ошибку, что попытка чтения.записи в защищённую память
Какой длины буфер выделяете?

И покажите пример как вызываете функцию.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
23.06.2015, 12:12 48
C#
1
IntPtr [] Buf = new IntPtr [64];
Уважаемый NickoTin, всё же, если не затруднит, растолкуйте процесс.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.06.2015, 13:40 49
C
1
2
3
4
BOOL WINAPI CH341GetDeviceDescr (// read the device descriptor
    ULONG iIndex, // specify the number CH341 equipment
    PVOID oBuffer, // point to a buffer large enough to hold the descriptor
    PULONG ioLength); // point to the length of the unit, is ready to read the length of the input, after returns actually read length
Функция требует на вход буфер, размером не больше 0x400 байт и заполняет его.
Вам нужно выделить непрерывный участок памяти и передать его функции.

Использование должно быть такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
IntPtr pBuffer = IntPtr.Zero;
    
try
{
    int bufferSize = 0x400;
    pBuffer = Marshal.AllocHGlobal(bufferSize);
 
    if (CH341GetDeviceDescr(index, pBuffer, ref bufferSize))
    {
        // Чтение прошло успешно, буфер валидный
        // Читаем данные из буфера, пример дать не могу, т.к. не знаю какие там данные
    }
}
catch(Exception ex)
{
    // Ошибка
}
finally
{
    if (pBuffer != IntPtr.Zero)
    {
        Marshal.FreeHGlobal(pBuffer);
        pBuffer = IntPtr.Zero;
    }
}
либо такое
C#
1
2
3
4
5
6
7
8
int bufferSize = 0x400;
var buffer = new byte[bufferSize];
 
if (CH341GetDeviceDescr(index, buffer, ref bufferSize))
{
    // Чтение прошло успешно, буфер валидный
    // Читаем данные из буфера, пример дать не могу, т.к. не знаю какие там данные
}
в зависимости от того какой прототип используете.
1
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
23.06.2015, 14:33 50
Цитата Сообщение от NickoTin Посмотреть сообщение
Функция требует на вход буфер, размером не больше 0x400 байт и заполняет его.
А почему именно такого размера буфер? Я в
C#
1
2
3
4
5
6
7
[DllImport("...")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static bool CH341GetDeviceDescr(
    uint iIndex,
    byte[] oBuffer,
    ref int ioLength
    );
использовал
C#
1
byte[] Buffer = new byte[32];
и всё работало. К тому же дискриптор устройства, который выводится на форму, равен всего лишь 34, т.е. это вообще один байт.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.06.2015, 14:42 51
Цитата Сообщение от mpetrovich Посмотреть сообщение
А почему именно такого размера буфер?
Так определено в документации, да и внутри функция проверяет что если буфер больше 0x400, то задает его равным 0x400. Используя недостаточный буфер нужно будет усложнять логику получения данных, что будете делать если буфер будет мал? Используя 0x400 задумываться о фейле со стороны нехватки памяти для записи не нужно.

Цитата Сообщение от mpetrovich Посмотреть сообщение
К тому же дискриптор устройства, который выводится на форму, равен всего лишь 34, т.е. это вообще один байт.
Что за дескриптор? От CH341OpenDevice который? Сейчас он 34, завтра может стать 12345678 например, никто этого не гарантирует. И да, завязываться на значение нельзя, тип IntPtr платформо-зависимый, в x86 процессе он 4 байта, в x64 - 8 байт.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
23.06.2015, 14:54 52
Цитата Сообщение от NickoTin Посмотреть сообщение
Что за дескриптор? От CH341OpenDevice который?
Ну да. Правда я перепутал дескриптор и номер версии получаемый от CH341GetVersion(). Сейчас глянул - дескриптор действительно принимает разные значения в диапазоне примерно 800-1000. Вы правы. Спасибо за разъяснения.
А в результате работы CH341GetDeviceDescr получается либо Thrue, либо False.

Не по теме:

Что-то у меня когда открыта эта ветка моя Опера постоянно обновляет страницу. Когда выходишь уровнем выше этого нет. Что за глюк?

0
NickoTin
23.06.2015, 16:00
  #53

Не по теме:

Цитата Сообщение от mpetrovich Посмотреть сообщение
Что-то у меня когда открыта эта ветка моя Опера постоянно обновляет страницу. Когда выходишь уровнем выше этого нет. Что за глюк?
Проверьте что на это не влияют какие-либо плагины, почистите кэш браузера. У меня FF - всё нормально, не думаю что это проблема форума.

0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
25.06.2015, 17:15 54
Тяжко как то идёт у меня дело. Оживил ещё несколько функций, но главного - создания терминала для приёма-передачи по SPI я так и не добился.
Проблема, например, запустить вот такую функцию:
C++
1
2
3
4
BOOL    WINAPI  CH341SetupSerial(  // CH341 Серийный набор функций, API должно использоваться только в последовательном режиме чипа CH341
    ULONG                           iIndex,  // CH341 оборудование, указанное число 0 соответствует первому устройству
    ULONG               iParityMode,  // Места режим проверки последовательной передачи данных CH341: NOPARITY / ODDPARITY / EVENPARITY / MARKPARITY / SPACEPARITY
    ULONG               iBaudRate );  // Значение скорости передачи последовательного порта. Может быть любое значение между 50 и 3000000
Совершенно непонятно где брать значения для iParityMode?
Делал так:
C#
1
2
3
4
[DllImport(CH341DLL)]
public static extern bool CH341SetupSerial(uint iIndex, uint iParityMode, uint iBaudRate);
var SetupSerial = Imports.CH341SetupSerial(0, 0, 100);
label1.Text = "" + SetupSerial;
Пробовал подставлять 0, 1, 2 - результат выполнения всегда False.
Вероятно из-за этого не работает и другая функция:
C#
1
2
3
4
[DllImport(CH341DLL)]
        public static extern bool CH341StreamSPI4(uint iIndex, uint iChipSelect, uint iLength, string ioBuffer);
string Buf = "Hello!!!";
Imports.CH341StreamSPI4(0, 0, 8, Buf);
На логическом анализаторе видно, что отправляется восемь байт, но анализатор их не может отчего то прочитать и скорость передачи сумасшедшая - 2Мбит/сек.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
26.06.2015, 15:34 55
Цитата Сообщение от mpetrovich Посмотреть сообщение
iParityMode
0, 1, 2, 3, 4 соответственно.
Цитата Сообщение от mpetrovich Посмотреть сообщение
Вероятно из-за этого не работает и другая функция
Вероятно.
Цитата Сообщение от mpetrovich Посмотреть сообщение
CH341StreamSPI4(uint iIndex, uint iChipSelect, uint iLength, string ioBuffer);
Почему string последний параметр? Судя по описанию это In-Out параметр, т.е. который функция может изменить. Должно быть либо byte[] либо IntPtr.

Цитата Сообщение от mpetrovich Посмотреть сообщение
На логическом анализаторе видно, что отправляется восемь байт, но анализатор их не может отчего то прочитать и скорость передачи сумасшедшая - 2Мбит/сек
Тут я ничем не помогу, т.к. с библиотекой не работал и не знаю какие корректные настройки нужны для порта.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
26.06.2015, 17:02 56
Цитата Сообщение от NickoTin Посмотреть сообщение
0, 1, 2, 3, 4 соответственно.
Цитата Сообщение от mpetrovich Посмотреть сообщение
Пробовал подставлять 0, 1, 2 - результат выполнения всегда False.
Подставлять 3 и 4 не пробовал, но от этого ситуация, я думаю, не поменяется.
Цитата Сообщение от NickoTin Посмотреть сообщение
Почему string последний параметр?
Хотелось прочитать что-то осмысленное в ответе устройства.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
06.08.2015, 16:21 57
Есть одна проблема, которую я не смог решить - это управление скоростью обмена по SPI. Для определения параметров приёма/передачи используется функция
C#
1
2
       [DllImport(CH341DLL)]
        public static extern bool CH341SetStream(uint iIndex, uint iMode);
В ней: iIndex - номер устройства, в моём случае 0, iMode - байт, который определяет следующее:
Bit[1:0]- speed:00=20kHz, 01=100KHz, 10=400KHz, 11=750kHz
Bit 7: SPI byte bit order, 0 = LSB first, 1 = MSB first
Bit [2]: SPI's I/O lines, 0 = single-input/ single-output (D3=clock / D5=out / D7=in) (default);
1 = double input/ double output: D3 clock / (D5=out D4=in) / (D7=in D6=out)
Далее для передачи данных используется функция
C#
1
2
 [DllImport(CH341DLL)]
      public static extern bool CH341StreamSPI4(uint iIndex, uint iChipSelect, uint iLength,  byte[] ioBuffer);
При просмотре на логическом анализаторе, я вижу, что скорость обмена на CLK равна порядка 2МБит/сек и она не меняется пр изменении аргумента iMode(Bit[1:0]) функции CH341SetStream(). Какие бы я ни ставил эти биты, скорость не меняется. В чём дело я не смог понять. Может кто-то подскажет?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
07.08.2015, 15:03 58
Цитата Сообщение от mpetrovich Посмотреть сообщение
CH341SetStream
Эта функция точно завершается корректно (возвращает true)?

Еще покажите как выставляете биты.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 70
07.08.2015, 15:59 59
Цитата Сообщение от NickoTin Посмотреть сообщение
Эта функция точно завершается корректно (возвращает true)?
Да, корректно. Сейчас проверил:
C#
1
2
bool SetStream = Imports.CH341SetStream(0, 128);
label5.Text = "" + SetStream;
На форме пишет "True".
Цитата Сообщение от NickoTin Посмотреть сообщение
Еще покажите как выставляете биты.
Вы имели в виду это:
C#
1
bool Set_D5_D0 = Imports.CH341Set_D5_D0(0, 41, 1);
?
Тоже, кстати, сейчас проверил.
C#
1
label4.Text = "" + Set_D5_D0;
На форме пишет "True".
0
07.08.2015, 15:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2015, 15:59
Помогаю со студенческими работами здесь

Как иcследовать DLL написанную на С++ 5.0?
Необходимо ее использовать в своем проекте на C#, необходимы имена методов и их параметры....

Как иcследовать DLL написанную на С++, Delphi?
Как иcследовать DLL написанную на С++, Delphi?

Как использовать DLL библиотеку написанную на VB в программе
Привет. Возможно кому-то мой вопрос покажется глупым, но все же. Вот написал я свой DLL на VB....

Не могу добавить DLL в проект
Суть такая: Для работы программы необходимо 2 DLL файла, один из них используется, я его добавил в...


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

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru