你好问问 导航,我想问问怎样用C语言程序生成DLL,然后在C#中调用?谢谢!

在C#中调用C语言函数
对于不太了解.Net的人,如果想要了解.Net,我必须给他介绍P/Invoke。P/Invoke是什么呢?简单地说,就是在.Net中调用本地代码(Native
code)的一种解决方案。所谓“本地代码”是相对于托管代码(Managed code)来说的。
P/Invoke实在是一个非常棒(awesome)的特性。本来,.Net 这项技术充分印证了托管程序(Managed
program)的种种好处,但是它不够“底层”。可是,这又有什么关系呢?我们有P/Invoke!这样,托管代码的优势和调用本地API的需求就无缝地融合在一起了。
我经常在论坛里看到一些新手提的这种问题:“我刚刚学会了C#,觉得它非常棒,很方便。我的问题是:我能用它调用短信猫(SMS
Modem)厂商提供的接口API吗?这些接口API可是C++的耶~~”……OK,现在一旦你了解到了P/Invoke,你就可以完全打消这方面的顾虑了。
闲言少叙,来看我们的例子。
我们的例子是:把一个C语言写的函数封装到一个动态链接库里面,然后在一个C#程序中很方便地调用它。
实现这样的一个例子对很多人来说真是意义重大,从此可以不再担心.Net不够“底层”了。
先看我们的C语言函数:
够简单吧。
一、为动态链接库暴露出函数接口
现在我们决定把它封装到一个动态链接库里面。为了让它能封装到动态链接库里面,我们给这个函数申明的前面加上这个:
源代码就变成了这样的:
二、编译,得到动态链接库
然后,我们利用Visual
C++自带的命令行工具cl、link将它封装成动态链接库。假设文件名为Test.c,我们希望得到Test.dll,命令如下:
我们也可以用gcc来编译得到Test.dll。命令如下:
现在我们就得到了Test.dll。
注:从Test.c得到Test.dll的办法很多,想详细了解的话请阅读一下两篇小文:
将C语言源代码编译成动态链接库&
Visual C++ 2010 Express Tips: 用 C 和 C++ 创建动态链接库&
三、在C#中通过P/Invoke调用Test.dll中的sum()方法
P/Invoke很简单。请看下面这段简单的C#代码:
上面这段代码够简单吧。除去注释,除去控制台输出,除去七零八碎的部分,剩下的东西就是这个了:
这个就是大名鼎鼎的P/Invoke。注意在这里我故意用了一个和C语言源代码中不一样的函数名Sum。C语言源代码中的函数名是sum,如果C#也用sum这个函数名,那句DLLImport就可以这样写了:
在这里不过是向您展示一下当C#中的函数名和DLL中的函数名不一致时,可以通过EntryPoint来进行映射(Mapping)。
编译并执行这段C#程序,执行时别忘了把Test.dll拷贝到执行目录中。结果当然是我们所预期的:
例子很简单,意义不简单。
参考文献:
将C语言源代码编译成动态链接库&
Visual C++ 2010 Express Tips: 用 C 和 C++ 创建动态链接库&
An Introduction to P/Invoke and Marshaling on the Microsoft
.NET Compact Framework
Essential P/Invoke&
.Net可以做什么&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C#与C语言怎样交叉调用,C#怎么使用C语言定义的变量_百度知道
C#与C语言怎样交叉调用,C#怎么使用C语言定义的变量
提问者采纳
应该对你有帮助的!可以用c语言制作dll,在使用C#调用dll或者用C语言制作一个子程序,用C#再传入参数调用两种方法
其他类似问题
为您推荐:
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所以无需兼带其他DLL即可运行。也发现有些用汇编和C封装的,那估计是高手才能编写啊!那怎么办呢?眼看一星期的交货期要到了,由于本人从来没有写过SDK开发包,心里那个着急啊,赶紧想出了三种处理方案。&方案一:用自己最熟悉的QT来写,毕竟QT也是C++的一种嘛,应该可以和VC通用的。初步实验,你妹啊,调用不起来,直接废弃。&方案二:找VC高手,自己掏钱出来找人写,客户是上帝,那可不能耽误呢!各大群里发消息,无奈高手要价太高(一个简单的socket通信封装,协议都有,熟手估计半天,要价8K有点高),绝大部分答话者使用.NET和JAVA语言,这个编写DLL肯定不大适合,你想想提供个DLL还要客户安装个框架,情何以堪!话说众里寻他千百度啊,我一个亲戚就是专门搞VC开发12年啦,这点程序半天就可以搞定的,找到之后,时间有限太忙了,没时间写,郁闷!再次放弃!~&方案三:时间一分一秒过去,真心着急啊,难不成自己用VC编写?有想法就赶紧行动,找到了古董级别的VS6.0的安装光盘,双击看到阔别七年的安装界面,突然之间有种热泪盈眶的感觉。老朋友啊,当年的编程入门,又记起了当年的大学,当年的图书馆,当年的初恋!搞就搞,新建MFC&DLL,我的妈呀,VC的命名规则实在让人抓狂!半自动语法提示更是让我有种自杀的冲动!安装了visualAssistX,还是不爽!话说编程也要带着快乐的心情嘛,所以果断放弃!&怎么办呢?既然QT也是C++,而且有个大名鼎鼎的WPS都是QT和MFC混合编程的,所以肯定有方法的,百度谷歌,找到一个qtwinmigrate的东西,在这里万分感谢qtwinmigrate的作者!好吧,参考里面的例子,正式开始编写了,咱就先来一个最初级的吧。&第一步:打开qt&creator,新建C++&库项目依次下一步,记得在选择需要的模块的时候选择QtGui模块,如果没有选中的话,后面编译通不过,qmfcapp这个类里面用了QtGui模块中的方法。&第二步:将多余的文件删除,_global.h还有其他两个文件删除,因为这是QT新建DLL自带的,我们要写的是可以供其他语言调用的DLL,我这里的例子是只用了一个函数和事件,没有用到界面的东西,所以从qtwinmigrate下面的src文件夹拷贝qmfcapp.h和qmfcapp.cpp这两个文件过来即可,如下。&第三步:更改pro文件,改为TARGET&=&qtdllTEMPLATE&=&libCONFIG&+=&dll&SOURCES&+=&\&&&&qmfcapp.cpp&\&&&&main.cpp&HEADERS&+=\qmfcapp.h&main.cpp代码如下&1&#include&"qmfcapp.h"&2&#include&"windows.h"&3&&&4&//windows下DLL函数入口&5&BOOL&WINAPI&DllMain(&HINSTANCE&hInstance,&DWORD&dwReason,&LPVOID&lpvReserved&)&6&{&7&&&&&static&bool&ownApplication&=&FALSE;&8&&&9&&&&&if&(&dwReason&==&DLL_PROCESS_ATTACH&)10&&&&&&&&&ownApplication&=&QMfcApp::pluginInstance(&hInstance&);11&&&&&if&(&dwReason&==&DLL_PROCESS_DETACH&&&&ownApplication&)12&&&&&&&&&delete&qA13&&14&&&&&return&TRUE;15&}16&&17&//定义函数回调指针18&typedef&void&(CALLBACK&*FunCallBack)(int&par);19&//定义回调函数20&FunCallBack&OnEvent=NULL;21&//定义回调参数22&int&23&&24&//定义C语言类型导出事件函数25&extern&"C"&__declspec(dllexport)&void&SetFunCallBack(FunCallBack&fun,int&p)26&{27&&&&&OnEvent=28&&&&&par=p;29&}30&&31&//定义C语言类型导出函数32&extern&"C"&__declspec(dllexport)&int&add(int&i)33&{34&&&&&//下面这段代码用来触发事件,如果仅仅是使用add函数的话可以删除.35&&&&&if&(i==110){36&&&&&&&&&if&(OnEvent){37&&&&&&&&&&&&&//当传入参数为110而且已经定义过回调函数的话,则触发事件.38&&&&&&&&&&&&&OnEvent(120);39&&&&&&&&&}40&&&&&}41&&42&&&&&return&i*2;43&}View Code&选择release编译,在目录下生成了一个DLL文件,这个文件就可以供VC/C#/VB/JAVA等调用了。&第四步:编写VC和C语言程序测试main.c代码如下:&1&#include&&stdio.h&&2&#include&&windows.h&&3&&&4&//定义函数指针&5&typedef&int&(*Add)(int);&6&//定义回调函数指针&7&typedef&void&(CALLBACK&*FunCallBack)(int);&8&&&9&//定义回调函数处理方法10&void&CALLBACK&HandleEvent(int&par)11&{12&printf("%d\n",&par);13&}14&&15&//主函数入口16&int&main(int&argc,&char&const&*argv[])17&{18&//定义DLL句柄19&HINSTANCE&hDll&=&LoadLibrary("qtdll.dll");20&if&(hDll&!=&NULL)21&{22&//定义回调函数指针23&typedef&void&(CALLBACK&*PFunCallBack)(FunCallBack);24&&25&//实例化回调函数指针26&PFunCallBack&SetFunCallBack=(PFunCallBack)GetProcAddress(hDll,"SetFunCallBack");27&//执行回调函数28&if&(SetFunCallBack){29&SetFunCallBack(HandleEvent);30&}31&&32&//实例化函数指针33&Add&add&=&(Add)GetProcAddress(hDll,"add");34&//调用DLL中的方法35&printf("%d\n",&add(1));36&&37&//调用DLL中的方法并触发事件38&printf("%d\n",&add(110));39&&40&FreeLibrary(hDll);41&}42&return&0;43&}View Code&运行结果如图:当传入的参数为110时,会触发事件,返回值120。&第五步:编写C#程序测试&1&using&S&2&using&System.Collections.G&3&using&System.T&4&using&System.Runtime.InteropS&5&&&6&namespace&qtdllTestNET&7&{&8&&&&&class&Program&9&&&&&{10&&&&&&&&&//声明DLL中的函数11&&&&&&&&&[DllImport("qtdll.dll")]12&&&&&&&&&public&static&extern&int&add(int&i);13&&&&&&&&&//声明DLL中的回调函数,即事件14&&&&&&&&&[DllImport("qtdll.dll")]15&&&&&&&&&public&static&extern&void&SetFunCallBack([MarshalAs(UnmanagedType.FunctionPtr)]&CallbackFun&pCallbackFun);&&&&&&&&16&&&&&&&&&[UnmanagedFunctionPointer(CallingConvention.Cdecl)]17&&&&&&&&&public&delegate&void&CallbackFun(int&i);18&&19&&&&&&&&&public&static&void&HandleEvent(int&i)20&&&&&&&&&{21&&&&&&&&&&&&&Console.WriteLine(i);22&&&&&&&&&}23&&24&&&&&&&&&static&void&Main(string[]&args)25&&&&&&&&&{26&&&&&&&&&&&&&CallbackFun&HandleEventX&=&HandleE27&&&&&&&&&&&&&SetFunCallBack(HandleEventX);&&&&&&&&&&&&28&&&&&&&&&&&&&Console.WriteLine(add(1));29&&&&&&&&&&&&&Console.WriteLine(add(110));30&&&&&&&&&&&&&Console.ReadLine();31&&&&&&&&&}32&&&&&}33&}View Code运行结果:CSDN下载地址:
阅读(...) 评论()&&&&我用opencv2.1编写了一个算法并生成了.DLL&,并在我电脑上用C#调用成功,
但是在没有安装opencv2.1的电脑上用C#使用,&请问怎把用到的openCV库里的.DLL&也一起封装到我要生成的
算法代码的DLL中,让其他没有安装opencv2.1的电脑的C#调用?
回复讨论(解决方案)
dll一起拷贝过去
&&能否说的详细点?
&&是这样的
&&&我需要用C语言编写的类库对openCV的库类进行封装,封装之后的C-DLL可以被本机的EXE调用,
&但是在其他电脑上无法运行,原因是调用openCV的DLL的时候使用了绝对路径。
请问到底怎么样调用?
问题已解决&
楼主可否把“用opencv2.1编写了一个算法并生成了.DLL&,并在我电脑上用C#调用成功”的例子发我一下,现在正在愁着怎么实现,我的邮箱,万分感激
楼主你是怎么封装的?我现在需要在自己的类里面使用到opecv的函数,然后将这个类封装成dll供java中的程序使用,求解,感激不尽啊
楼主&,我是opencv菜鸟&请问如何将用opencv写的C程序封装成dll。感激不尽!
怎么封装的,求帮助

我要回帖

更多关于 你好问问导航多少钱 的文章

 

随机推荐