Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/107: Рейтинг темы: голосов - 107, средняя оценка - 4.75
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
1

Создание dll на C++ и вызов метода dll из C#.

25.09.2011, 16:45. Показов 21590. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ, может кто-нибудь выложить конкретный пример, как это сделать? Например есть же нативная библиотека bass.dll, для неё есть обёртка Bass.NET.dll, вот её уже подключаем к проекту и пользуемся, как сделать такое самому? Можете показать на примере?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2011, 16:45
Ответы с готовыми решениями:

Вызов из c# метода в Dll с++
Доброго времени суток, нужна помощь имеется ДЛЛ написанная на с++ И мои труды написанные на C#.В...

Вызов функций из DLL на С++
В программе:using System; using System.Collections.Generic; using System.Linq; using...

Вызов dll на Delphi из C#
Здравствуйте! Я понимаю, что проблема старая, я много прочитал по этому поводу, но ничего не...

Импорт метода из Dll написанной на C++
Всем привет! Вот какая проблема. Нужно вызвать метод из Dll написанный на c++. Вот как выглядит...

19
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.09.2011, 22:22 2
Цитата Сообщение от Casper-SC Посмотреть сообщение
Например есть же нативная библиотека bass.dll, для неё есть обёртка Bass.NET.dll, вот её уже подключаем к проекту и пользуемся, как сделать такое самому?
1) Посмотреть через рефлектор;
2) Написать всё самому, определить все импорты (DllImport) и обернуть всё это в класс, который упрощает работу, если сравнивать её с прямым вызовом функций.

Вот маленький пример обертки.
2
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
25.09.2011, 22:28  [ТС] 3
Ну меня по большому счёту интересует как вообще всё это сделать. То есть какой тип проекта создать (С++), как подключить библиотеку к проекту на C#. Поэтому и прошу пример, чтобы запустить и посмотреть что и как взаимодействует. Про рефлектор я в курсе.
1
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.09.2011, 22:30 4
Casper-SC, обычная native dll (не CLR) и экспортировать из неё функции, подключать всё через DllImport... Если нужны именно проекты, то попробую у себя поискать что, или написать небольшой пример...
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
25.09.2011, 22:35  [ТС] 5
Цитата Сообщение от SSTREGG Посмотреть сообщение
подключать всё через DllImport
А то есть каждый метод (или как там в C++... функцию...) надо подключать через DllImport? То есть нельзя подключить именно библиотеку и получить методы (хотя походу так и есть, вроде метаданных как в .NET нету в нативе).

Цитата Сообщение от SSTREGG Посмотреть сообщение
Если нужны именно проекты, то попробую у себя поискать что, или написать небольшой пример...
Было бы вообще супер. Если можно, то хотелось бы увидеть конкретно передачу строки из натив dll в C# код (как раз для примера всё вроде как просто).
1
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.09.2011, 22:39 6
Цитата Сообщение от Casper-SC Посмотреть сообщение
А то есть каждый метод (или как там в C++... функцию...) надо подключать через DllImport?
Да, каждую (или в зависимости от нужды) экспортируемую функцию.
Цитата Сообщение от Casper-SC Посмотреть сообщение
Если можно, то хотелось бы увидеть конкретно передачу строки из натив dll в C# код
Тут, раздел 4.1 (Пример вызова функции с разным окончанием (A или W) в зависимости от установленного CharSet).

Постараюсь что-нибудь найти из проектов, или набросать небольшой, но на C... и не сегодня )
2
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.09.2011, 04:18 7
Вот 2 проекта (на C и C#). Проект на C (dll) - это какая-то бредовая (другого ничего не придумал) реализация работы с файлом. В теории там должно быть: мэппинг файла, чтение файла, установка спец. прав (не знаю зачем, просто взбрело в голову) на область памяти выделенной под буфер, и вроде всё
Проект на C# это wrapper над экспортируемыми функциями из dll.

p.s. no comments
Вложения
Тип файла: rar filespec.rar (87.6 Кб, 677 просмотров)
3
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
27.09.2011, 07:29  [ТС] 8
Спасибо. Сегодня гляну вечером.
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.10.2011, 01:24  [ТС] 9
Пытаюсь сделать своё. Что-то ничего не работает.

Создал "Проект Win32". В мастере выбрал "Статическая библиотека", снял галочку с: "Предварительно скомпилированный заголовок". Добавил класс Test. Создался Test.h и Test.cpp. Test.h вообще удалил и удалил весь текст из Test.cpp. Скомпилировал NL.dll и кинул в папку с прогой, которая должна вызывать функцию с библиотеки.

Написал это (скорее всего пароль в dll тоже не буду хранить открытым текстом, можно тупо вперемешку хранить наверное, короче там видно будет, заставить работать бы):
C++
1
2
3
4
5
6
7
#pragma once
#include <Windows.h>
 
LPCWSTR GetText(void)
{
    return L"mjovs*eigfs73#r2228554!"; //пароль хочу передавать в SecureString
}
В C# пока просто пытаюсь вообще заставить работать, потом буду в SecureString пробовать получать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    internal class Constants
    {
        public String DataBasePassword { get; private set; }
 
        [DllImport("NL.dll", CharSet = CharSet.Unicode, EntryPoint = "GetText")]
        static extern StringBuilder GetText();
 
        internal Constants()
        {
            StringBuilder sb = GetText(); 
            DataBasePassword = sb.ToString();
        }
    }
Добавлено через 9 минут
Кстати не копирую с Си проекта, так как вообще не знаю, что там да как. В С++ я думаю разберусь, как изначально пароль хранить шифрованным или... Короче не открытым текстом, с Си думаю будет мутево, придётся качать книгу, читать и т.д. Я уж раз начал, то лучше продолжу по С++ читать. Другими словами охота сразу сделать на С++, так как его всё хочу выучить, но до недавнего времени, свободное время у меня отсутствовало.
1
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
13.10.2011, 02:15 10
C
1
extern "C" _declspec(dllexport) LPCWSTR GetText(void)
так попробуй
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.10.2011, 02:21  [ТС] 11
C++
1
2
3
4
5
6
7
#pragma once
#include <Windows.h>
 
extern "C" _declspec(dllexport) LPCWSTR GetText(void)
{
    return L"d45taASDWd3w4fzawew228*(9+";
}
error C2059: синтаксическая ошибка: строка d:\программирование\nl\test.c 4 1 NL
1
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
26.03.2017, 23:41 12
можно тему продолжить по прошествии стольких лет
0
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
03.05.2017, 09:47 13
NickoTin, А как ещё можно сделать связь между кодом на C и C#?

Поясню sqlite не верно обрабатывает перевод в верхний и нижний регистр не латиницы.
Это не ошибка (как разрабочик я откуда знаю как это делается в той или иной операционной системе значит родной ASCII).
Я эти функции нашел заменил на winapi и все вроде работает.
Но чтобы в net то заработало... я скачал исходники net привязки и разобраться не могу как она сделана, не на DllImport она сделана. Может кто то сталкивался?
Вот исходники System.Data.SQLite http://system.data.sqlite.org/... ource.wiki
1
Эксперт .NET
10563 / 6487 / 1506
Регистрация: 25.05.2015
Сообщений: 19,654
Записей в блоге: 14
03.05.2017, 09:55 14
Цитата Сообщение от rams Посмотреть сообщение
не на DllImport она сделана
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace System.Data.SQLite
{
    [SuppressUnmanagedCodeSecurity]
    internal static class UnsafeNativeMethods
    {
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate SQLiteErrorCode xCreate(IntPtr pDb, IntPtr pAux, int argc, IntPtr argv, ref IntPtr pVtab, ref IntPtr pError);
        ...
        [DllImport("SQLite.Interop.dll")]
        internal static extern IntPtr sqlite3_bind_parameter_name_interop(IntPtr stmt, int index, ref int len);
 
        [DllImport("SQLite.Interop.dll")]
        internal static extern IntPtr sqlite3_column_database_name_interop(IntPtr stmt, int index, ref int len);
        ...
0
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
03.05.2017, 10:29 15
Rius, Я же не говорил, что он там не используется. Я связь не могу осилить вот в исходнике есть функция например типа соннект к базе как ее в SQLiteConnection затащили
1
Эксперт .NET
10563 / 6487 / 1506
Регистрация: 25.05.2015
Сообщений: 19,654
Записей в блоге: 14
03.05.2017, 11:39 16
Цитата Сообщение от rams Посмотреть сообщение
Поясню sqlite не верно обрабатывает перевод в верхний и нижний регистр не латиницы.
Цитата Сообщение от rams Посмотреть сообщение
Я эти функции нашел заменил на winapi и все вроде работает.
Покажите пример ошибки и ваше исправление?
1
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
03.05.2017, 12:03 17
Rius,Вопрос то не об ошибках
Информация вот отсюда, если вам интересно http://forum.sources.ru/index.php?showtopic=386692
Качаете исходники не net исправляете и собираете и работает
1
Эксперт .NET
10563 / 6487 / 1506
Регистрация: 25.05.2015
Сообщений: 19,654
Записей в блоге: 14
03.05.2017, 12:34 18
rams, да, вопрос в другом. Можно ли решить проблему, не меняя ни нативную библиотеку, ни System.Data.SQLite...
Смотрели, например, Case-Insensitive Sort of UTF8 Data Using System.Data.SQLite и Case-insensitive LIKE in SQLite ?
1
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
03.05.2017, 13:05 19
Rius, Спасибо посмотрим, прадва меня больше виртуальные таблицы fts4 и match интересует, но может и там будет работать. Пробовали fts поиск ох...ь скорость
1
Эксперт .NET
10563 / 6487 / 1506
Регистрация: 25.05.2015
Сообщений: 19,654
Записей в блоге: 14
03.05.2017, 20:50 20
Небольшой пример для like:
Кликните здесь для просмотра всего текста
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Data.SQLite;
 
namespace ConsoleAppSqlite
{
    class Program
    {
        static void Main(string[] args)
        {
            SQLiteConnection.CreateFile("database.sqlite");
 
            using (var connection = new SQLiteConnection("Data Source=database.sqlite;Version=3;"))
            {
                connection.Open();
 
                // Create table
                string sqlCreateTable = "create table sample (name varchar(20), value int)";
 
                using (var cmdCreateTable = new SQLiteCommand(sqlCreateTable, connection))
                {
                    cmdCreateTable.ExecuteNonQuery();
                }
 
                // Fill table
                using (var cmdInsert = new SQLiteCommand("insert into sample (name, value) values (@name, @value);", connection))
                {
                    SQLiteParameter paramName = new SQLiteParameter("@name", System.Data.DbType.String, 20);
                    SQLiteParameter paramValue = new SQLiteParameter("@value", System.Data.DbType.Int32);
                    cmdInsert.Parameters.Add(paramName);
                    cmdInsert.Parameters.Add(paramValue);
 
                    for (int i = 0; i < 10; i++)
                    {
                        paramName.Value = String.Format("Имя_{0}", i);
                        paramValue.Value = i;
                        cmdInsert.ExecuteNonQuery();
                    }
                }
 
                // Read table
                using (var cmdSelect = new SQLiteCommand("select * from sample where name like @name;", connection))
                {
                    SQLiteParameter paramName = new SQLiteParameter("@name", System.Data.DbType.String, 20);
                    cmdSelect.Parameters.Add(paramName);
 
                    paramName.Value = String.Format("Имя_{0}", 2);
 
                    using (var reader = cmdSelect.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine("Name: {0}, Value: {1}", reader.GetValue(0), reader.GetValue(1));
                        }
                    }
 
                    paramName.Value = String.Format("%Имя_%");
 
                    using (var reader = cmdSelect.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine("Name: {0}, Value: {1}", reader.GetValue(0), reader.GetValue(1));
                        }
                    }
 
                    paramName.Value = String.Format("%имя_%");
 
                    using (var reader = cmdSelect.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine("Name: {0}, Value: {1}", reader.GetValue(0), reader.GetValue(1));
                        }
                    }
 
                    // Register UPPER function
                    SQLiteFunction.RegisterFunction(typeof(SqlLiteFunctions.Upper));
 
                    cmdSelect.CommandText = "select UPPER(sample.name), sample.value  from sample where UPPER(name) like UPPER(@name);";
                    paramName.Value = String.Format("%имя_%");
 
                    using (var reader = cmdSelect.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine("Name: {0}, Value: {1}", reader.GetValue(0), reader.GetValue(1));
                        }
                    }
 
                }
 
                connection.Close();
            }
        }
    }
 
    public static class SqlLiteFunctions
    {
        [SQLiteFunction(Arguments = 1, FuncType = FunctionType.Scalar, Name = "UPPER")]
        public class Upper : SQLiteFunction
        {
            public override object Invoke(object[] args)
            {
                string str1 = Convert.ToString(args[0]).ToUpperInvariant();
                return str1;
            }
        }
    }
}
1
03.05.2017, 20:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2017, 20:50
Помогаю со студенческими работами здесь

Вызов функции из dll написанной на C
Привет всем! Возникла такая задача, решить не могу ни как. Есть dll. В ней есть функция (вроде...

Вызов функции из DLL на C#, используя С++
Есть функция в test.DLL на C#, например такая: using System; public class TestFuncClass { ...

Подключение сторонних DLL и вызов функции
Добрый день всем! Меня беспокоит следующий вопрос, который мне необходимо решить как можно скорее:...

Вызов .dll во время выполнения программы
При вызове неуправляемого кода из управляемого, используется атрибут DllImport. В нем задается путь...


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

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