Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
1

Нарушение прав доступа при исполнении при работе с C# DLL

19.01.2015, 21:52. Показов 2916. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код на C++, который загружает длл и вызывает из нее метод.
C++
1
2
3
4
5
6
HMODULE hLib;
hLib = LoadLibrary(L"Support.NET.dll");
int id = 0;
            int(*get_max_index)(string path);
            (FARPROC &)get_max_index = GetProcAddress(hLib, "get_max_index");
            id = get_max_index("C:\\Users\\Никита Аншаков\\Documents\\Visual Studio 2013\\Projects\\OpenCV_console\\Debug\\data\\");
и dll
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Support.NET
{
    public class Class1
    {
        public int get_max_index(string path)
        {
            int[] array = new int[100];
            int i = 0;
            int n;
            DirectoryInfo dir = new DirectoryInfo(path);
            foreach (var item in dir.GetDirectories())
            {
                if (int.TryParse(item.Name, out n))
                {
                    Console.WriteLine(item.Name);
                    array[i] = Convert.ToInt32(item.Name);
                }
                i++;
            }
            Array.Sort(array);
            n = array[array.Length - 1];
            return n;
        }
        public void CheckAndCreateDirectory(string path)
        {
            if (!(Directory.Exists(path)))
            {
                Directory.CreateDirectory(path);
            }
        }
    }
}
И вся эта конструкция падает на этапе
C++
1
d = get_max_index("C:\\User...")
С такой ошибкой
Код
Необработанное исключение по адресу 0x7483CB49 в OpenCV_console.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00000000.
Помогите, пожалуйста, у меня просто не достаточно знаний видимо и я где то делаю ошибку. Спасибо.
Миниатюры
Нарушение прав доступа при исполнении при работе с C# DLL  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2015, 21:52
Ответы с готовыми решениями:

SDL: Нарушение прав доступа при работе с рендером
Есть следующее приложение: Programm.h #include <windows.h> #include <SDL.h> #include...

0xc0000005 нарушение прав доступа при исполнении по адресу 0x00000000 OpenGL
Помогите пожалуйста! Я ещё учусь писать на C++ и работать с OpenGL. Вот код: #define...

Нарушение прав доступа при чтении при работе с большим массивом
Здравствуйте. Пытаюсь заполнить большой массив, вроде правильно объявил его, но на разных итерациях...

Sfml-graphics-2.dll, нарушение прав доступа при записи
Доброго времени суток. Возникла очень странная проблема в процессе разработки, никакого ответа по...

3
7780 / 6550 / 2981
Регистрация: 14.04.2014
Сообщений: 28,608
20.01.2015, 08:54 2
Проверяй, что GetProcAddress() успешно завершилась. Наверное, адрес-то не возвращается.
Сомнительно, что вообще такое будет работать, у тебя даже строка не Unicode.
0
Заблокирован
20.01.2015, 11:03 3
Лучший ответ Сообщение было отмечено nanshakov как решение

Решение

Цитата Сообщение от nanshakov Посмотреть сообщение
hLib = LoadLibrary(L"Support.NET.dll");
Во первых, ты даже не удосужился проверить, загрузилась ли у тебя библиотека (if(hLib) {} ), ну да ладно, раз ошибка дальше...
Цитата Сообщение от nanshakov Посмотреть сообщение
(FARPROC &)get_max_index = GetProcAddress(hLib, "get_max_index");
Да она в принципе не может работать, т.к. тут хрень какая - то. Зачем - то FARPROC& замутил ....
Но дело даже не в этом, а в том, что ты пытаешься из шарпа экпортировать неуправляемый код в С++
Это вроде как возможно через C++/CLI, ну так же можно через COM.
Да и логика... Вот смотри, ты пытаешься экспортировать из шарпа функцию, которая в качестве параметра принимает чисто шарповою строку:
C++
1
int get_max_index(string path)
ну и как ты думаешь, что должен подумать С++ при виде этого? Верно - ничего хорошего.
Для импорта функций из DLL пишется обычно typedef, допустим для функции в DLL:
C++
1
extern "C" __declspec(dllexport) int GetSome(float x);
typedef будет выглядеть так:
C++
1
typedef int (*GET_SOME)(float);
, где GET_SOME - тип указателя на функцию в твоей DLL.

Теперь про строки и прочие не POD данные. Их даже в чисто в С++ можно спокойно "перекидывать" динамическую память из DLL в DLL только при соблюдение тонны условий, типа одна и та же версия компилятора, его параметров и тд...
В общем случае делается так:
1. Либо ты вообще не обмениваешься с DLL динамической памятью и проектируешь DLL с чисто С-шными интерфейсами.
2. Либо ты принимаешь указатель на память в DLL, что то с ним делаешь и удаляешь эту память через функцию всё той же DLL.

P.S.: а про экспортирование или импортирование стандартных коллекций C# вообще забудь, ну сам подумай, в C# - garbage collector (сборщик мусора), в С++ его нет, кто и как будет удалять память?
1
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
22.01.2015, 22:44  [ТС] 4
DukeNukem, Спасибо тебе большое а подробный ответ. Я пойду совсем другим путем и откажусь от идеи цеплять такие длл.
0
22.01.2015, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2015, 22:44
Помогаю со студенческими работами здесь

Ошибка при работе с OpenCV: "нарушение прав доступа при чтении по адресу"
Привет, всем:-) Имеется следующий код: #include <opencv2/core/core.hpp> #include...

Исключение по адресу 0x01423B40 в ASM1.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x01423B40
Здравствуйте! Очень нужна помощь, не могу понять в чем проблема, вроде правильно все делаю, но...

0x53CDE541 (ucrtbased.dll) 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000002E
Доброе утро! Задача состояла в том, чтобы поменять порядок символов в строке. Не могу склеить...

Необработанное исключение по адресу 0x7798E43E (ntdll.dll) в bunkers.exe: 0xC0000005: нарушение прав доступа при чтении
прога вылетает на необработанном исключении.... на этих строчках message.addPart(&content);...


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

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

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