c#调用c++DLL

昨天写了igraph在vs2010下的使用,其实目的是为了今天这一篇作准备。个人目的实际上是想在c#里调用igraph,那么弄成dll就行啦。c++

 

step 一、新建DLL工程c#

使用vs2010,新建win32控制台应用程序,在安装向导里选择“DLL”和“空项目”。注意,根据实际状况这里不选择空项目其实也能够,可是通常都不会用到stdafx相关的功能,为了不没必要要的问题,仍是不引入它们。函数

给项目作出你须要的引入目录、库目录等的配置,新建一个cpp文件,在这里写你的函数便可。我测试的代码以下:测试

#include "igraph.h"

extern "C" __declspec(dllexport) double sp(int vid1,int vid2)
{
	igraph_t g;
	igraph_vector_t v;
	igraph_vector_t e;
	FILE *net;
	net=fopen("C:/Users/Administrator/Desktop/testgeo/1/1101_ncol_10.txt","r");
	igraph_strvector_t *predefnames;

	igraph_read_graph_ncol(&g, net,NULL,false,IGRAPH_ADD_WEIGHTS_NO,false);
	igraph_vector_init(&v, igraph_ecount(&g));
	igraph_vector_init(&e, igraph_ecount(&g));
	igraph_get_shortest_path(&g,&v,&e,vid1,vid2,IGRAPH_ALL);
	double path=(double)(igraph_vector_size(&v)-1);

	fclose(net);
	igraph_vector_destroy(&v);
	igraph_vector_destroy(&e);
	igraph_destroy(&g);

	return path;
}

注意,对于外部能够调用的函数,其前必定要加上声明。调试

extern "C" __declspec(dllexport)

随后生成便可,DLL就会在工程的Debug或Release文件夹下了。有的教程说还须要Source.def文件,可我这里发现并不是必须。code

 

step 二、调用orm

新建一个c#winform工程来测试刚写好的DLL。对每一个DLL的方法都须要一个函数来调用,其参数和DLL中对应,前面须要申明调用,写法以下:blog

[DllImport("testigraphdll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double sp(int vid1,int vid2);

直接在视图里添加引用可能会不成功(几个月前另外一个开发时成功引用了,此次却不行),我将DLL放在Debug或Release文件夹下,故这里是相对路径。还有一个细节问题:c和c#变量类型须要对应好,如char*和string对应等等。我此次起初在c++里写的是long int型的返回值,但它并非c#里的long型,所以结果对不上出了错,为此我还调试了很久觉得是DLL引用错误呢。教程

 

搞定,提及来也没有什么复杂的,仅作记录啦。开发