Вызов C++ DLL только с экспортом __declspec из C#C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Вызов C++ DLL только с экспортом __declspec из C#

Сообщение Anonymous »


Я отправляю новый вопрос по обсуждаемой теме, так как не могу найти решение или тот же сценарий, что и я.

Я создаю решение .NET 8 и пытаюсь вызвать функции C++ из .DLL.

Эта DLL не моя, у меня нет для нее ни файлов .lib, .obj, ни .pdb.

Рассматриваемая DLL — это более старая сборка RakNet, поэтому я могу использовать последний доступный код в GitHub в качестве ссылки, однако эта DLL имеет более старую версию, поэтому я не могу просто собрать ее заново из GitHub.

Основная причина использования именно этой .DLL заключается в том, что я разрабатываю «совместимый» собственный сервер для игры, поэтому клиент также будет использовать эту старую версию RakNet.

С помощью декомпиляции с помощью Cutter или Ghidra я проверил, что экспортированные функции остались такими же, как в коде GitHub.

Эти функции экспортируются в обычном формате __declspec, а не как «extern «C»», и из-за этого C#, похоже, не может загрузить их и найти функции при использовании аннотации [DLLImport()].

Я пытался создать файл .lib с помощью VS Tools, но это не сработало.

Потратив на это более 5 часов, я решил обратиться за помощью и проверить, сталкивался ли кто-нибудь с подобной ситуацией и знает, возможно ли это и как вызвать C++ DLL из C# с этими ограничениями. Очень жду советов и идей.

Спасибо.

РЕДАКТИРОВАТЬ 1:

Добавление более конкретного контекста текущей проблемы и ошибки.

Чтобы определить расположение DLL и быть более точным, я загружаю ее с помощью:

[DllImport("kernel32.dll", SetLastError = true)] частный статический extern IntPtr LoadLibrary (строка dllToLoad); общественная статическая пустота LoadRakNetDll() { вар-дескриптор = LoadLibrary (dllPath); если (дескриптор == IntPtr.Zero) { Console.WriteLine("Не удалось загрузить DLL"); } } Затем рассматриваемый метод, с которым я пытаюсь взаимодействовать, объявляется следующим образом:

[DllImport("RakNet64", CallingConvention = CallingConvention.StdCall)] public static extern int Startup(uint maxConnections, SocketDescriptorocketDescriptors, uintsocketDescriptorCount, int threadPriority); Я проверил определение EntryPoint, однако из исключения я увидел, что если его опустить, .NET будет использовать имя метода в качестве точки входа.

Исключение, которое я получаю:

System.EntryPointNotFoundException HResult=0x80131523 Сообщение=Невозможно найти точку входа с именем «Запуск» в DLL «RakNet64». Я также тестировал изменение CallingConvention, но безрезультатно.

Проведение исследований, опрос ИИ и т. д. повсюду указывает на необходимость использования функций экспорта DLL с использованием "extern "C", но я могу ошибаться.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • .dll и .dll с экспортом, в чем разница?
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Проблемы с экспортом данных в Excel с помощью ClosedXML и шаблона XLSX
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Проблемы с экспортом .usdz в SceneKit
    Anonymous » » в форуме IOS
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Godot (4.3) Проблема с экспортом в Windows, неожиданное поведение сценария C#
    Anonymous » » в форуме C#
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Конвертировать datagridview в файл PDF... как настроить столбцы перед экспортом PDF?
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»