如何在C#中调用VC++中编写的DLL

 我来答
煮蛋壳0014
推荐于2016-11-19 · 超过44用户采纳过TA的回答
知道答主
回答量:94
采纳率:0%
帮助的人:101万
展开全部
C#是managed code,而C++ 是unmanaged code,所在要在C#中调用C++中编写的dll,是非常繁琐的一件事情。如果调用Windows中的USER32.DLL,KERNEL.DLL等,直接Dllimport就可以了,非常简单。如果是自己定义的dll,但不带有class,那么也比较easy。如果用VC编写的dll还带有class,那就只能自认倒霉,好好的捣腾一番了。据说是由两种办法:(1)编程把你现时的非托管(unmanaged)的DLL转为托管的DLL; (2)用COM技术来处理你的DLL,这个方法倒是不错,毕竟COM是一个标准。在经过对C#一周的熟悉之后,发现以上两条路都是非常困难,COM组件需要注册和destroy,我对COM组件本来就是一知半解,看书看代码看的头大。今天早上很早醒来,就发现外面阴森森的,细雨淋漓,心想坏了,这一天估计又要浪费了,什么进展也不会有了。就在偶万般无奈想要找枪手的情况下,想起来老板几年前对我说过的一句话:lhg,你从来都是知难而退,从来不会迎难而上,这样子怎么可以做好学问。那时老板愤怒的表情这一个时刻还历历在目,每每面对困难想要放弃的时候,总会想起老板这句话。我想自己还没有穷途末路吧,至少没有人说过这条路不可以走下去。反思的结果就是,我开始写测试代码,从fly的nludll开始,因为这个dll是导出的类,我想了另外一个办法,重新写一个最简单的dll--testdll,这个testdll只有一个函数,没有class,唯一的函数用以调用nludll的导出类中的输出函数,然后,C#的代码调用这个testdll的唯一导出函数(而非导出类)。想不到此方法竟然可行,从C#通过testdll竟然可以进入nludll内部。 其中还是遇到了很多波折,C#传递参数和C++传递参数的方式不同,在验证参数传递方面耗费了很多功夫。接下来遇到的麻烦就是对数据库的访问了,nludll中很老土的使用了access数据库,那些表我放在C#程序的目录下根本就找不到路径,在c++中更改成绝对路径,还是找不到,我几乎把程序下的每个目录都试遍了,就是没辙。我就在那里琢磨琢磨,琢磨得快昏昏欲睡了,突然想起表是不是应该存在和在dll相同的目录下呢,也就是说放在bin\debug目录下,尝试一次,果然成功了。此时此刻很累了,刚刚结果出来的时候,还着实很兴奋。那么用什么方法奖励一下自己呢,想了半天,一个人吃饭真是一点意思都没有。想去足疗了,可惜这附近没有良子,怕一个人进了不干净的店,出不来。顺便提一句,这几年去过很多地方,每到一个地方,总会去体验一个地方的足疗文化,其中很多的乐趣。
tattackor
推荐于2018-05-17 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:864万
展开全部
1、如果这是个用c#编写的dll文件,那么using DLL文件的命名空间,然后就可以调用命名空间中的类。
2、如果是不是用c#编写的dll文件,那么就把dll放到合适位置(winform程序目录下,web程序bin文件夹下,system32文件夹下)。
然后using System.Runtime.InteropServices;
[DllImport("dll文件名.dll")]
public static extern 类型 方法名(参数);
即可调用此方法
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式