Вызов вложенной функции C ++ из C# дает исключение System.AccessViolationException - PullRequest
1 голос
/ 30 апреля 2020
  • Имя моей C ++ DLL MyDLL.dll, которое связывается с TestDLL.dll
  • Теперь я хочу вызывать функции из MyDLL.dll в моем C# проекте

Визуализация

-----------   communicates    -------------   communicates    ---------------
- C# Code -  -------------->  - MyDLL.dll -  -------------->  - TestDLL.dll -
-----------                   -------------                   ---------------

MyDLL.dll записана в C++
TestDLL.dll записана в C

Вот код

MyDLL.h

#define MyDLL_API __declspec(dllexport) 

extern "C" {
    MyDLL_API int sum(int a, int b);
    MyDLL_API int do();
}

MyDLL. cpp

#include "MyDLL.h"
#include <Windows.h>

extern "C" {

    typedef int (CALLBACK* MYFUNC1)(int, int);
    typedef short* (CALLBACK* MYFUNC2)(const char*);

    int MyDLL_API sum(int a, int b) // This function works fine
    {
        return a + b;
    }


    int MyDLL_API do()
    {
        int t = -1;

        HINSTANCE test_dll;
        MYFUNC1 myFunc1;
        MYFUNC2 myFunc1;

        test_dll = LoadLibraryA("c:\\TestDLL.dll");
        if (!test_dll) {
            t=0;
        }

        myFunc1 = (MYFUNC1)GetProcAddress(test_dll, "TestFunc");
        if (!myFunc1) {
            t=1;
        }

        myFunc2 = (MYFUNC2)GetProcAddress(test_dll, "AuthFunc");
        if (!myFunc2) {
            t=2;
        }

        // If I put 'return t' here, it works fine!

        (*myFunc2)("Hello World"); // <-- This line causing the error
        return t;
    }

}

C# Основная программа

class Program
{
    public class MyClass
    {
        [DllImport(@"c:\MyDLL.dll", EntryPoint = "sum")]
        public static extern int Sum(int a, int b);

        [DllImport(@"c:\MyDLL.dll", EntryPoint = "do")]
        public static extern int Do();
    }

    static void Main(string[] args)
    {

        int summation = MyClass.Sum(30, 20); // This runs fine.
        Console.WriteLine("Sum is: " + summation);

        int resultCode = MyClass.Do(); // This causing the ERROR.
        Console.WriteLine("Result code is: " + resultCode);

        Console.ReadLine();
    }
}

Подсказка об исключении

System.AccessViolationException: 'Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...