【发布时间】:2012-03-15 05:11:29
【问题描述】:
我想使用 C# 中的 C++ DLL。 C++ DLL 是 win32 控制台应用程序。我已成功调用它,并希望在 c# 中处理我从 c++ 获得的数据。然而,C# 应用程序在执行 DLL 后退出,即这一行:GetArrayFromDLL();
我是 C# 和 Visual 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 \n\n", 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 \n\n",afx[i],afy[i]);
f = fopen(file_write,"a+");
if(f != NULL);
fprintf(f,"%lf %lf\n",afx[i],afy[i]);
fclose (f);
}
}
else
{
printf("Error opening fail");
}
fclose (pFile);
}
}
【问题讨论】:
-
了解相关函数的精确 C++ 声明会有所帮助。
-
c# 代码没有任何可疑。也许 c++ dll 是麻烦制造者
-
我对命名空间 ConsoleApplication 感到困惑。我怀疑您项目的输出类型是控制台应用程序。将其设置为 Windows 应用程序以使用 WinForms。 P/Invoke 总是让我头疼,但这些资源对我有一点帮助:pinvoke.netswig.org
-
我绝对同意控制台应用程序是 Visual Studio 中控制台应用程序的默认名称,即使它只是一个名称。
-
感谢您的建议。是的。我使用默认名称..我正在尝试在此处发布 DLL 代码..