Неуправляемый вызов не происходит из управляемого кода C # - PullRequest
0 голосов
/ 15 октября 2018

Я вызываю неуправляемую функцию из управляемого кода.Но неуправляемый вызов не происходит.

Управляемый код C #: (Создан проект (Sampletest) из Visual C # -> Консольное приложение) Sampletest:

namespace Sampletest
{
    class Program
    {
        const string Dllpath2 = @"C:\Users\apc\source\repos\Sampletest\SampleDll\Debug\SampleDll.dll";
        [DllImport(Dllpath2, EntryPoint = @"IsUPSPresent", CallingConvention = CallingConvention.Cdecl)]
        public static extern Boolean IsUPSPresent();
        static void Main(string[] args)
        {
            var test = IsUPSPresent();

            Console.ReadKey();
        }
    }
}

Неуправляемый код C ++:

(Создан проект dll (SampleDll) из Visual C ++ -> Рабочий стол Windows -> Библиотека динамических ссылок)

Есть определение "IsUPSPresent ()"в SampleDll.cpp

#include "stdafx.h"

BOOL IsUPSPresent()
{
    BOOL    bRetValue = FALSE;

    return bRetValue;
}

Но когда мы делаем неуправляемый вызов, сначала он собирается в файл dllmain.cpp, присутствующий в неуправляемом коде.

#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

, затем он не собирается

Функция BOOL IsUPSPresent ()

и возврат к управляемому вызову по адресу "var test = IsUPSPresent ();"

, показывающий ошибку "Необработанное исключение в 0x7705D6C7 (ntdll).dll) в Sampletest.exe: 0xC0000096: Привилегированная инструкция.

Настройки, которые я сделал:

Для проекта C #,

Debug-> Selected "Включить отладку собственного кода "

И я выбрал" Отладка "," x86 "

Пожалуйста, помогите мнерешить эту проблему.

1 Ответ

0 голосов
/ 15 октября 2018

Вы должны объявить IsUPSPresent, используя атрибут __declspec(dllexport) или использовать .def -файл.Кроме того, чтобы преодолеть искажение имени в C ++, ваше определение должно быть extern "C" в C ++ - коде.

extern "C" {
    BOOL __declspec(dllexport) IsUPSPresent()
    {
        BOOL bRetValue = FALSE;
        return bRetValue;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...