Как правильно использовать C Dll в C # - PullRequest
2 голосов
/ 14 марта 2019

Привет, сообщество. Я изучаю программирование самостоятельно и использую dll.

получаю сообщение об ошибке:

enter image description here

C:

#include <stdio.h>

const char *print(const char *message)
{
    if (message != 0) {
        const char *message1 = "Connected";
        return message1;
        message = "";
    }
    return "Message empty";
}

C #:

     public partial class Form1 : Form
     {
         /*Declaration*/
         bool T;
         string a;

         [DllImport("DLLC.dll")]
         static extern string print(string message);

         public Form1()
         {
             InitializeComponent();
         }

         private void button1_Click(object sender, EventArgs e)
         {
             a = print("Send");
             if (T)
             {
                 label1.Text = a ;
                 T=false;
             }
             else{
                 label1.Text = "BAD";
                 T=true;
             }

         }
     }

Текстовые сообщения, потому что переполнение стека не позволяет опубликовать только код:

Идея состоит в том, чтобы научиться использовать функции из c в c #.

Также я хотел бы использовать библиотеку open62541 для OPC UA SERVER и сделать пользовательский интерфейс с окнами форм.

В интернете недостаточно понятной информации о том, как делать обертки и другие программы ... нет видеона YouTube об этом.

1 Ответ

4 голосов
/ 14 марта 2019

Вам нужно пометить функцию в DLL как экспортированную. Есть два способа сделать это. Вы можете либо создать файл .def и назвать экспортируемые функции, либо добавить спецификатор __declspec(dllexport) к сигнатуре функции.

Чтобы создать файл .def, в Visual Studio с открытым проектом C DLL щелкните правой кнопкой мыши «Исходные файлы», а затем в «Visual C ++» -> «Код» выберите «Файл определения модуля (.def»). )». Во вновь созданном файле .def вы можете перечислить функции, которые вы хотите экспортировать, например:

LIBRARY mydll
EXPORTS
    function1
    function2
    function3

Затем при сборке DLL доступны function1, function2 и function3.

Кроме того, имейте в виду, что если вы вручную не зададите соглашение о вызовах (например, int __stdcall function1(int a, int b);), соглашение о вызовах будет __cdecl по умолчанию, и поэтому, когда вы добавляете строку для импорта функции через P / Invoke, вы также должен иметь атрибут CallingConvention = CallingConvention.CDecl. Несоблюдение соглашений о вызовах приведет к повреждению стека в коде вызова.

...