Как вызвать cygwin скомпилированный C ++ из .NET Core? - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь сделать что-то похожее на this :

Я работаю на Windows, но я собираюсь сделать так, чтобы мой код работал на Linux позже (поэтому я работаю с cygwinи clion для C ++).VS2017 для компиляции C # для приложения .NET Core с обычным компилятором C #.Моя проблема заключается в получении этой ошибки в Visual Studio:

"Программа '[19944] dotnet.exe' вышла с кодом -1073741819 (0xc0000005)« Нарушение прав доступа »."

Вот мой файл cmake (сгенерированный с помощью clion):

cmake_minimum_required(VERSION 3.10) project(callFromCsharp)

set(CMAKE_CXX_STANDARD 14)

add_library(callFromCsharp SHARED library.cpp)

Вот мой код C ++ в library.cpp:

#include <cstdint>

extern "C" __declspec(dllexport) int32_t Test(){
    return 10;
}

Это мой вызов cmake, сгенерированныйclion

C: \ Users \ Daant.CLion2018.1 \ system \ cygwin_cmake \ bin \ cmake.exe --build / cygdrive / c / Users / Daant / CLionProjects / callFromCsharp / cmake-build-release --target callFromCsharp - -j 6

Вот мой код C #:

    class Program
    {
        [DllImport("cygcallFromCsharp.dll", EntryPoint = "Test", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern Int32 Test();

        [STAThread]
        static void Main()
        {
            var res = Test();
            Console.WriteLine($"Done! {res}");
            Console.ReadLine();
        }
    }

Как решить эту проблему?Я просто хочу вызвать метод C ++ без ошибок или исключений.

1 Ответ

0 голосов
/ 05 июня 2018

Давайте начнем с того, что не нужно делать

при загрузке Cygwin dll из C # (я думаю, из Visual Studio это будет то же самое).

  1. не используйте AnyCPU в качестве платформы, предпочитайте использовать платформу x64 или x86 соответственно для библиотеки Cygwin.
  2. по какой-то причине, я еще не понял, почему, вызывая sprintf, sscanf,stringstream ... и печать в консольные методы из библиотеки DLL приводит к остановке программы.

Теперь, что вы можете сделать:

  1. Убедитесь, что папка cygwin bin добавлена ​​в путь, или скопируйте зависимости вашей DLL в папку DLL (обычно это: cygwin1.dll, cyggcc_s-seh-1.dll cygstdc ++ - 6.dll. Используйте инструмент для проверки зависимостей проверить).
  2. Просто чтобы убедиться: добавьте макрос EXPORT_API, используйте его для каждого экспортируемого метода.как:

#define EXPORT_API extern "C" __cdecl __declspec(dllexport)

Ваш пример DLL очень прост, скомпилируйте ваш код с помощью консоли Cygwin: g++ -c library.cpp; g++ -o cygcallFromCsharp.dll library.o Я использовал из C # следующее (отладочный каталог dir установлен в положение dll):

DllImport(@"cygcallFromCsharp.dll", CallingConvention=CallingConvention.Cdecl)] static extern int Test();

Надеюсь, это поможет.

...