【问题标题】:Call c++ DLL from C# application从 C# 应用程序调用 c++ DLL
【发布时间】:2020-04-26 08:23:13
【问题描述】:

我有 C# 作为我的前端应用程序,我想从我的 c# 调用 c++ dll,但我收到错误。 我在这里发布我的代码,请帮助我解决这个问题:

程序.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 "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”的入口点

当我在不使用命名空间和类的情况下编写相同的 CPP 代码时,它工作正常。 即

头文件:source.h

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

c++ 类: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。

【问题讨论】:

    标签: c# c++ c++-cli


    【解决方案1】:

    感谢您的回答。 我通过创建一个包含托管代码的额外类(包装器类)解决了这个问题。 c# 类以与我在问题中提到的相同方式调用此包装器类。这个包装类比调用 c++ 类并将结果返回给 UI。

    【讨论】:

      【解决方案2】:

      最简单的方法是创建一个“代理”:一组 clear-C 函数,这些将调用您的 c++ 函数。 我认为调用 c++ 函数不是一个好主意:名称装饰从编译器版本更改为版本。

      【讨论】:

      • 感谢您的回复。如果您详细说明,我对代理一无所知,小例子对我很有帮助。
      【解决方案3】:

      你有这个项目托管在某个地方吗? 在第一个视图中,我会说您需要先构建 c++ 项目(仅 c++ !!!)然后运行 ​​C# 项目。 也许你想看看这里:Testprojects 尤其是“MessageBox”内容展示了如何将 C++ 与 C# 一起使用。还有一些带有 UWP 的测试项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多