Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
tumanovalex
3 / 3 / 0
Регистрация: 09.07.2009
Сообщений: 221
#1

Вызов функций из DLL на С++ - C#

29.06.2015, 17:31. Просмотров 701. Ответов 4
Метки нет (Все метки)

В программе:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
 
namespace CsCons
{
  public class clDll
  {
    [DllImport("d:\\MyProgramming\\CsCpp\\Debug\\CsCppDll.dll", EntryPoint="Add", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int Add(int a1);
 
    [DllImport("d:\\MyProgramming\\CsCpp\\Debug\\CsCppDll.dll", EntryPoint = "Sub", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int Sub(int s1);
 
   }
 
 
  class Program
  {
    static void Main(string[] args)
    {
      int res = clDll.Add(25);
      Console.WriteLine("Результат = {0}", res);
      res = clDll.Sub(15);
      Console.WriteLine("Результат = {0}", res);
      Console.ReadKey();
    }
  }
}
функции из DLL работают, но возникли следующие вопросы:
- перед каждой функцией нужно записывать в квадратных скобках DLLImport и EntryPoint или есть другой путь?
- сколько раз загружается DLL? Только при первом вызове или при каждом DLLImport?
- можно ли один раз записать DllImport и иметь возможность вызова всех функций из DLL?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2015, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов функций из DLL на С++ (C#):

Вызов функций, возвращающих указатель на структуру, из нативной dll - C#
Тут на форуме уже не раз задавали вопросы, как вызвать функцию из нативной dll. И в случае, если функция возвращает "нормальный" тип, у...

Создание dll на C++ и вызов метода dll из C#. - C#
Народ, может кто-нибудь выложить конкретный пример, как это сделать? Например есть же нативная библиотека bass.dll, для неё есть обёртка...

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

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

Вызов API функций - C#
Как вызывать в C# API функции, например вот эту BOOL CALLBACK MonitorEnumProc( __in HMONITOR hMonitor, __in HDC hdcMonitor, ...

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

4
NickoTin
Почетный модератор
Эксперт .NET
8244 / 3526 / 239
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
30.06.2015, 00:22 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от tumanovalex Посмотреть сообщение
перед каждой функцией нужно записывать в квадратных скобках DLLImport и EntryPoint или есть другой путь?
DllImport - да, путь можно относительный использовать (т.е. просто имя файла например), EntryPoint - не обязательно, только если имя функции отличается от того что используется в прототипе.
Цитата Сообщение от tumanovalex Посмотреть сообщение
сколько раз загружается DLL? Только при первом вызове или при каждом DLLImport?
Только при первом. Стандартный механизм загрузки библиотек таков, что если библиотека уже загружена, то просто увеличивается счетчик числа загрузок и возвращается адрес уже загруженной библиотеки.
Цитата Сообщение от tumanovalex Посмотреть сообщение
можно ли один раз записать DllImport и иметь возможность вызова всех функций из DLL?
Нет.

В вашем случае импорт можно упростить до такого:
C#
1
2
    [DllImport("CsCppDll.dll")]
    public static extern int Add(int a1);
при условии что библиотека будет находиться рядом с исполняемым файлом.
0
tumanovalex
3 / 3 / 0
Регистрация: 09.07.2009
Сообщений: 221
30.06.2015, 16:26  [ТС] #3
Спасибо большое за подробные объяснения. Возник еще один вопрос:
Можно ли обратиться в C# к переменной, определенной в DLL? В моем случае это Ncount. Я попробовал обратиться к ней аналогично функции, не получилось.
0
NickoTin
Почетный модератор
Эксперт .NET
8244 / 3526 / 239
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
30.06.2015, 16:45 #4
Цитата Сообщение от tumanovalex Посмотреть сообщение
Можно ли обратиться в C# к переменной, определенной в DLL?
Нет. Возможен только вызов экспортируемых функций.

Добавлено через 9 минут
Хотя нет, возможно, но смысла не вижу.
Пример для теста:
C
1
2
3
4
5
6
__declspec(dllexport) int value;
 
__declspec(dllexport) int __stdcall GetValue(void)
{
    return value;
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern IntPtr LoadLibrary(string dllToLoad);
 
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool FreeLibrary(IntPtr hModule);
 
        [DllImport("Win32Project1.dll")]
        private static extern int GetValue();
 
        static void Main(string[] args)
        {
            IntPtr mydll = LoadLibrary("Win32Project1.dll");
 
            IntPtr addrUnmanagedHeap = GetProcAddress(mydll, "value");
            
            Marshal.WriteInt32(addrUnmanagedHeap, 10);
            var k = GetValue();
        }
0
tumanovalex
3 / 3 / 0
Регистрация: 09.07.2009
Сообщений: 221
30.06.2015, 16:47  [ТС] #5
Спасибо за ответы.
0
30.06.2015, 16:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2015, 16:47
Привет! Вот еще темы с ответами:

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

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

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

.NET 2.x Вызов процедур из DLL, расположенных на удаленном компьютере - C#
Добрый день! Столкнулся с необходимостью вынести часть функционала своей C# программы в DLL, расположенную на сервере. Кто нибудь...


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

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

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