c#调用c++DLL

昨天写了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引用错误呢。

 

搞定,说起来也没有什么复杂的,仅做记录啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值