.NET Standard и pInvoke, System.EntryPointNotFoundException Не удается найти точку входа - PullRequest
0 голосов
/ 13 декабря 2018

Я предполагаю, что этот вопрос уже задавался в отношении более старых версий Visual Studio и без использования .NET Core 2.1 или .NET Standard.

В настоящее время я работаю над .NET Core 2.1приложение в Visual Studio 2017. В моем проекте мне нужно использовать существующую библиотеку DLL из проекта C ++ / CLI (Dynamic Linked Library).Это довольно сложно, потому что .NET Core 2.1 не поддерживает C ++ / CLI "из коробки".

Моя архитектура:

  1. .NET Core Project :, получает бизнес-логику из моего проекта .NET Standard, внедренного
  2. .NET Standard Project : содержит бизнес-логику и загружает DLL.
  3. C ++ /CLI : динамически связанная библиотека, предлагает некоторую дополнительную бизнес-логику, я не могу перейти на C #.

Чтобы иметь возможность использовать DLL из C ++ / CLI в моем коде C #, я использую pInvoke для загрузки функциональности в проекте .NET Standard.

Я пытаюсь проверить:

 var test = MyLibHelper.AddNumbers(1, 2);

К сожалению, я всегда получаю следующую ошибку, если я не помещаю логику в проект C ++ / CLI Hello World:

System.EntryPointNotFoundException: 'Невозможно найти точку входа с именем' AddNumbers 'в DLL' MyLib.dll '.'

В моем проекте .NET Standard (2) яУ меня есть вспомогательный класс для загрузки DLL. Метод:

internal static class MyLibHelper
{
    [DllImport("MyLib.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int AddNumbers(int n1, int n2);
}

В моем проекте C ++ / CLI (3) у меня есть исходный файл MyLib.cpp , который предоставляет функциональность:

extern "C" __declspec(dllexport) int AddNumbers(int n1, int n2)
{
    return n1 + n2;
}

На самом деле это кодирование работает нормально, если я создаю проект Hello World C ++ / CLI без заголовочного файла и использую __declspec (dllexport) и extern "C".

Мои вопросы:

Учитывая, что вместо приложения Hello World C ++ / CLI мне нужно использовать существующий проект,

  • Где я должен поместить этот внешний "C" в обазаголовок и исходный файл?
  • Мне нужно использовать файл заголовка, поэтому необходимо ли размещать extern "C" и __declspec (dllexport) также в заголовочный файл?
  • Я продолжаю получать сообщение об ошибке «Невозможно найти точку входа с именем ...», где я могу найти точку входа для моего метода C ++?
  • Что касается точки входа, я читал о «искаженных именах» - знаете ли вы, где / как / в каком файле я могу найти искаженное имя моего метода C ++?

Большое спасибо!

...