Member 14686752 Ответов: 2

Вызов библиотеки DLL C++ из приложения C#


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

Программы.в 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, как показано ниже:
Заголовок: source.h
#include <string>
using namespace std;

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

класс c++: source.cpp
#include <stdio.h>
#include "CppSource.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++: source.cpp
#include "CppSource.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, которая имеет пространства имен и claases в моем приложении c#?

Что я уже пробовал:

Все, что я пробовал, было опубликовано в этом вопросе.

2 Ответов

Рейтинг:
2

KarstenK

В вашем заявлении об импорте отсутствуют некоторые важные детали. И не используйте полный путь для импорта, но найдите dll в каталоге приложения.

Прочтите мою статью и код о совместимости C# Вызов Всех Станций и сравните разницу с вашим решением.


Рейтинг:
1

OriginalGriff

Первая проблема заключается в том, что DisplayHelloFromDLL является ли метод экземпляра test класс - что означает, что так же, как и эквивалент C# :

public class test
    {
    public void test()
        {
        printf("This is default constructor");
        }
    void DisplayHelloFromDLL(char * name, int appId)
        {
        printf("Hello from DLL !\n");
        printf("Name is %s\n", name);
        printf("Length is %d \n", appId);
        }   
    }
Вы не можете вызвать его без ссылки на экземпляр test класс:
text t = new test();
t.DisplayHelloFromDLL(str, str.Length);

Чтобы вызвать его без экземпляра, метод должен быть static: Статическое Ключевое слово в C++[^] или вообще не является частью класса.

И есть реальная проблема: вы не можете использовать классы C++ в C#, если только DLL не построена для CLI - и тогда вы можете просто добавить ссылку на нее и использовать ее, как если бы она была в C#.