Вызов c ++ DLL из C# приложения - PullRequest
0 голосов
/ 26 апреля 2020

У меня C# в качестве внешнего приложения, и я хочу вызвать c ++ dll из c#, но я получаю ошибку. Я публикую здесь свой код, пожалуйста, помогите мне решить эту проблему:

Program.cs

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestCSharp
{
     class Program
     {
          [DllImport("C:\\Users\\xyz\\source\\repos\\Project1\\Debug\\TestCpp.dll", CallingConvention = CallingConvention.Cdecl)]
          public static extern void DisplayHelloFromDLL(StringBuilder name, int appId);

          static void Main(string[] args)
          {
               try
               {
                   StringBuilder str = new StringBuilder("name");                
                   DisplayHelloFromDLL(str, str.Length);
                   str.Clear();
               }
               catch(DllNotFoundException exception)
               {
                    Console.WriteLine(exception.Message);
               }
               catch(Exception exception)
               {
                   Console.WriteLine("General exception " + exception.Message);
               }
               finally
               {
                   Console.WriteLine("Try again");
               }
          }
     }
 }

и cpp код, как показано ниже:

Заголовок: источник .h

#include <string>
using namespace std;

extern "C"
{
    namespace Test
    {
        class test
        {
        public:
            test();
            __declspec(dllexport) void DisplayHelloFromDLL(char * name, int appId);
        }
    }
}

c ++ class: source. cpp

#include <stdio.h>
#include "source.h"

Test::test::test()
{
    printf("This is default constructor");
}
void Test::test::DisplayHelloFromDLL(char * name, int appId)
{
    printf("Hello from DLL !\n");
    printf("Name is %s\n", name);
    printf("Length is %d \n", appId);
}

Код успешно строится, но при запуске я получил Невозможно найти точку входа с именем 'DisplayHelloFromDLL' в DLL.

Тот же код CPP, когда я пишу без использования пространства имен и класса, он работает нормально. т.е.

Заголовок: source.h

extern "C"
{
    __declspec(dllexport) void DisplayHelloFromDLL(char * name, int appId);
}

c ++ class: source. cpp

#include "source.h"

void DisplayHelloFromDLL(char * name, int appId)
{
    printf("Hello from DLL !\n");
    printf("Name is %s\n", name);
    printf("Length is %d \n", appId);
}

Итак, как мне использовать DLL, которая имеет пространства имен и предложения в мое c# приложение.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Есть ли у вас где-нибудь этот проект? С первого взгляда я бы сказал, что вам нужно сначала собрать проект c ++ (только c ++ !!!), а затем запустить проект C#. Возможно, вы хотели бы взглянуть здесь: Testprojects Особенно материал "MessageBox" показывает, как использовать C ++ с C#. Также есть несколько тестовых проектов с UWP.

0 голосов
/ 06 мая 2020

Спасибо за ответы. Я решил проблему, создав один дополнительный класс (класс Wrapper), который содержит управляемый код. Этот класс-обертка вызывается классами c# так же, как я упоминал в этом вопросе. Этот класс-обёртка затем вызывает класс c ++ и возвращает результат в пользовательский интерфейс.

0 голосов
/ 26 апреля 2020

Самый простой способ - создать «прокси»: набор функций clear- C, которые будут вызывать ваши функции c ++. Я думаю, что вызывать функцию c ++ не очень хорошая идея: оформление имени изменяется с версии на версию компилятора.

...