簡體   English   中英

從 C# 應用程序調用 c++ DLL

[英]Call c++ DLL from C# application

我有 C# 作為我的前端應用程序,我想從我的 Z240AA2CEC4B29C56F3BEE520ADC 中調用 c++ dll 我得到了 EZEE 錯誤。 我在這里發布我的代碼,請幫助我解決這個問題:

程序.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代碼如下:

Header:source.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);
}

代碼構建成功,但是當我運行它時,我無法在 DLL 中找到名為“DisplayHelloFromDLL”的入口點

當我在不使用命名空間和 class 的情況下編寫相同的 CPP 代碼時,它工作正常。 IE

Header: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);
}

那么如何在我的 c# 應用程序中使用具有命名空間和分類的 DLL。

感謝您的回答。 我通過制作一個包含托管代碼的額外類(包裝類)解決了這個問題。 這個包裝器 class 由 c# 類調用,方法與我在問題中提到的相同。 這個包裝器 class 比調用 c++ class 並將結果返回給 UI。

最簡單的方法是創建一個“代理”:一組 clear-C 函數,這些函數將調用您的 c++ 函數。 我認為調用 c++ function 不是一個好主意:名稱裝飾從編譯器版本更改為版本。

你有這個項目托管在某個地方嗎? 在第一個視圖中,我會說您需要先構建 c++ 項目(僅 c++.:!),然后運行 C# 項目。 也許你想看看這里: Testprojects特別是“MessageBox”的東西展示了如何使用 C++ 和 C#。 還有一些帶有 UWP 的測試項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM