昨天写了igraph在vs2010下的使用,其实目的是为了今天这一篇做准备。我的目的其实是想在c#里调用igraph,那么弄成dll就行啦。
step 1、新建DLL工程
使用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文件,可我这里发现并非必须。
step 2、调用
新建一个c#winform工程来测试刚写好的DLL。对每个DLL的方法都需要一个函数来调用,其参数和DLL中对应,前面需要申明调用,写法如下:
[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引用错误呢。
搞定,说起来也没有什么复杂的,仅做记录啦。