昨天写了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引用错误呢。教程
搞定,提及来也没有什么复杂的,仅作记录啦。开发