从 C# 应用程序调用 C++ DLL
Call c++ DLL from C# application
我将 C# 作为我的前端应用程序,我想从我的 c# 调用 c++ dll,但出现错误。
我在这里发布我的代码,请帮助我解决这个问题:
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 代码:
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 代码时,它工作正常。
即
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。
最简单的方法是创建 "proxy": 一组清晰的 C 函数,这些函数将调用您的 C++ 函数。
我认为调用 c++ 函数不是个好主意:名称修饰因编译器版本而异。
你有这个项目托管在什么地方吗?
在第一个视图中,我会说您需要先构建 c++ 项目(仅 c++!!!),然后 运行 C# 项目。
也许您想在这里看看:Testprojects
特别是 "MessageBox" 内容展示了如何将 C++ 与 C# 一起使用。还有一些带有 UWP 的测试项目。
感谢您的回答。
我通过制作一个包含托管代码的额外 class(Wrapper class) 解决了这个问题。这个包装器 class 由 c# classes 以与我在问题中提到的相同的方式调用。这个包装器 class 比调用 c++ class 和 return 结果到 UI.
我将 C# 作为我的前端应用程序,我想从我的 c# 调用 c++ dll,但出现错误。 我在这里发布我的代码,请帮助我解决这个问题:
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 代码:
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 代码时,它工作正常。 即
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。
最简单的方法是创建 "proxy": 一组清晰的 C 函数,这些函数将调用您的 C++ 函数。 我认为调用 c++ 函数不是个好主意:名称修饰因编译器版本而异。
你有这个项目托管在什么地方吗? 在第一个视图中,我会说您需要先构建 c++ 项目(仅 c++!!!),然后 运行 C# 项目。 也许您想在这里看看:Testprojects 特别是 "MessageBox" 内容展示了如何将 C++ 与 C# 一起使用。还有一些带有 UWP 的测试项目。
感谢您的回答。 我通过制作一个包含托管代码的额外 class(Wrapper class) 解决了这个问题。这个包装器 class 由 c# classes 以与我在问题中提到的相同的方式调用。这个包装器 class 比调用 c++ class 和 return 结果到 UI.