C # доступ к простому C dll

1

Мне нужно использовать C dll (а не C++) в С#. Я попробовал базовый пример. Но не сработало.

Я использую визуальную студию Microsoft. Я создал новый проект. C++> Win32 Project Затем выбрали dll и пустой проект. В выбранных опциях Компилировать как: "Скомпилировать как код C (/TC)"

#include <stdio.h>

__declspec(dllexport) void HelloFromDLL()
{
    printf("DLL Works!\n");
}
__declspec(dllexport) double TestFunc(double a, double b, double c)
{
    return (a+b)*c;
}

Файл защиты: Linker> Input> File Defination File

БИБЛИОТЕКА TestLib
ОПИСАНИЕ "Описание"
ЭКСПОРТ
HelloFromDLL @1
TestFunc @2

Когда я использую extern "C", он дает ошибку C2059

Без него: если я использую функцию в коде С#, дающей ошибку. Если не использовать, но с кодовой строкой DllImport, работайте.

[DllImport("TestLib.dll")]
public static extern void HelloFromDLL();

Я пытался с и без файла заголовка. Что я должен делать?

  • 0
    используйте __declspec (dllexport) или файл def, но не оба. И вам нужен внешний "C".
  • 0
    удален файл определения, но extern "C" выдает ошибку. Я не могу построить Dll с ним.
Показать ещё 1 комментарий
Теги:
dll

1 ответ

1
Лучший ответ

В вашем случае неправильное соглашение о вызове для dll

[DllImport ("TestLib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void HelloFromDLL();

Соглашения об использовании по умолчанию - stdcall

Вы можете указать WINAPI, PASCAL или __stdcall в своем коде C для прототипов функций или использовать компилятор /Gz вместо компиляции вашей DLL с помощью соглашений о вызовах stdcall

PS Я предполагаю, что ваша dll доступна для вашей программы С#, а BOOL APIENTRY DllMain() включен в код вашей dll

  • 0
    DllMain не является обязательным, нет?
  • 0
    Спасибо за это! Как я вижу, внешний "C" не нужен. Но я обнаружил еще одну проблему. DLL работает только с 32-битной (x86). не с х64.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню