从 C# 应用程序调用 C++ DLL

萨萨克·阿加瓦尔

我有 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 代码时,它工作正常。IE

头文件: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。

萨萨克·阿加瓦尔

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Delphi应用程序无法调用简单的C ++ DLL函数

从Java应用程序调用C#dll

从C ++应用程序调用C#DLL调用SOAP Web服务

从C#应用程序调用C ++ dll时找不到Enry点

如何在C ++ / CLI DLL中从C#应用程序调用函数?

从 Win32 控制台应用程序调用 dll [C]

Java应用程序通过JNI调用C ++ DLL;如何最好地分配内存?

如何从 VBA 应用程序调用 C DLL 并返回一个数组?

从WIN32应用程序使用的C#COM DLL调用Java代码?

在.Net应用程序中调用C ++ Dll时出现System.Access违规异常

Cygwin1.dll C++ 应用程序错误

通过 C# 运行应用程序的 dll

DLL中子应用程序中的C ++事件循环

从64位c#WinForms应用程序调用第三方32位dll时的事件处理

我可以从 64 位 C# Winforms 应用程序调用 MAPI32.DLL > MAPISendMail 吗?

C ++:外部应用程序调用超时

为什么导入 Mixed Native/CLR lib/dll 的本机 C++ 应用程序不在 Mixed lib/dll 中的外部变量上调用 ctor/dtor

C ++调用DLL函数

从python调用C ++ dll

从Java调用C ++ dll

从Fortran调用C dll

从Python调用的C ++ dll

在C#WPF应用程序中使用外部C ++ DLL

在C#WPF或Windows Forms应用程序中使用DirectX c ++ DLL

AccessViolationException读取从C ++ / CLI DLL在C ++应用程序中分配的内存

使用 C++ DLL 的 C# 应用程序的内存使用情况

无法启动程序C:\ ... \ ****。dll VB.net应用程序Visual Studio 2015

将本机非托管 C++ DLL 加载到托管 C# 应用程序会导致 DLL 输出垃圾

EasyHook:从本机C应用程序中的32位应用程序注入64位dll吗?