来自C#的C++DLL调用
C++ DLL call from C#
我想使用C#中的C++DLL。C++DLL是win32控制台应用程序。我已经成功地调用了它,并希望在c#中处理来自c++的数据。然而,C#应用程序在执行DLL后退出,即此行:GetArrayFromDLL();
我是C#和可视化C++的新手。有人能提供一些建议吗?
感谢
namespace ConsoleApplication1
{
class Program
{
[DllImport("Lidar_DataCal_CDLL.dll")]
public static extern void GetArrayFromDLL();
static void Main(string[] args)
{
Console.WriteLine("This is C# program");
GetArrayFromDLL();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
这是我在win32应用程序中编写的DLL。
extern "C"
{
__declspec(dllexport) void GetArrayFromDLL()
{
/// Reading hex from a file
FILE * pFile;
FILE * f;
signed int array_data[81],array_data1[81],i;
double fangle,fsin,fcos,fangle_rad;
double afx[81],afy[81];
int px,py;
char file_read[20] = "scandataset1.txt";
char file_write[20] = "xycordinates1.txt";
pFile = fopen ( file_read,"a+");
if (pFile != NULL)
{
for (i=0;i<80;i++)
{
char buffer[3];
fscanf (pFile, "%x",&array_data[i]);
sprintf ( buffer ,"%d", array_data[i]);
printf ( "I have read: %s nn", buffer);
array_data1[i] = atoi(buffer);
// finding angle
fangle = 20 -( (i+1-1)*0.5);
fangle_rad = (PI*fangle/180);
fsin = -sin(fangle_rad);
fcos = cos(fangle_rad);
afx[i] = array_data[i] * fsin;
afy[i] = array_data[i] * fcos;
// printf ("X: %lf and Y: %lf nn",afx[i],afy[i]);
f = fopen(file_write,"a+");
if(f != NULL);
fprintf(f,"%lf %lfn",afx[i],afy[i]);
fclose (f);
}
}
else
{
printf("Error opening fail");
}
fclose (pFile);
}
}
基本上只有两种直接的方法可以调用C++方法。要么围绕面向对象的接口创建C可调用的包装器(函数),这使它与语言无关,但并不总是美观或可维护的,要么可以在C#和C++之间使用面向对象的粘合语言。
在.NET 1.1中,粘合语言是托管C++(现在已经不存在了)。
它的后续语言可能是您的最佳选择,是C++/CLI。这种语言最好只用于托管和非托管世界之间的一个相对较薄的层,它能够很好地将其统一起来。
(实际上:如果您使用的是VS2010,并且出于任何原因针对的是4以上的.NET,则添加C++/CLI代码将迫使您在系统上同时安装VS 2008,但您仍然可以完全使用VS2010 IDE来实现这三种语言。)
在c#中使用本机c++时必须面对的主要问题是封送问题。检查一下,确保你没有这些东西。既然你已经告诉dll执行良好,那么唯一可能出现的问题就是函数的返回类型。C代码可能不是罪魁祸首,它一定是dll。
在导入dll 时,也可以尝试指定调用约定和入口点
链接到dll导入的问题
链接到非托管代码Inter-OP
相关文章:
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 在 NodeJS 异步调用C++ DLL
- 从C#调用C++dll引发SEHException
- 为什么在调用C#DLL时不需要提供字符串缓冲区
- 从Delphi调用C++DLL时发生访问冲突
- 从 Python 调用 Windows DLL 函数时出错
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- 从 JNI 调用的 DLL 从哪里获取其内存以进行分配,例如 Malloc
- 使用指针调用C++ DLL 函数
- 如何从 UWP 应用调用"libheif.dll"函数
- 从C++调用 Delphi DLL 函数
- 在C#代码中调用C DLL
- 从C#调用C DLL方法
- 是否可以使用 Excel::_Application::Run 调用 C# dll 方法
- 从C++调用 Delphi DLL IStream 参数的问题
- 在 C# 中调用C++ DLL 库中导出的函数
- 内存损坏从vb.net调用c dll
- 当参数之一是指针数组时,如何从C#调用C DLL
- 调用C++dll的C#dll在windows 10上找不到该dll