Я предполагаю, что этот вопрос уже задавался в отношении более старых версий 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 "из коробки".
Моя архитектура:
- .NET Core Project :, получает бизнес-логику из моего проекта .NET Standard, внедренного
- .NET Standard Project : содержит бизнес-логику и загружает DLL.
- 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 ++?
Большое спасибо!