c#调用c++编写的dll

我用vs.netc#做了一个界面。要实现空能需要调用一个c++编译的dll,里面有一个类,我需要用到类的两个函数,其中一个函数的返回值的这个类类型的指针。请问怎么实现?详... 我用vs.net c#做了一个界面。要实现空能需要调用一个c++编译的dll,里面有一个类,我需要用到类的两个函数,其中一个函数的返回值的这个类类型的指针。请问怎么实现?详细一点,跪求!!! 展开
 我来答
myh441
2010-12-14 · 超过20用户采纳过TA的回答
知道答主
回答量:54
采纳率:0%
帮助的人:50.5万
展开全部
使用vc++6.0创建dll,然后用vs2010调用。
1.vc++6.0创建动态链接库工程:win32 Dynamic-Link Library。随便起名,dllDemo,不过注意的是,你生成的dll文件是和你的工程名是一样的而不是你的cpp文件名。创建dllDemo.cpp和dllDemo,h。下面是代码。
/*
* dllDemo.h
*/
extern "C" _declspec(dllexport) int Sum(int a,int b);//加法函数。
extern "C" _declspec(dllexport) int Max(int a, int b);//取较大值函数
extern "C" _declspec(dllexport) int Min(int a, int b);//取较小值函数
///:~
/*
*dllDemo.cpp
*
#include "dllDemo.h"
extern "C" _declspec(dllexport)int Sum(int a, int b)
{
return a+b;
}
extern "C" _declspec(dllexport)int Max(int a, int b)
{
if(a>=b)
return a;
else
return b;
}extern "C" _declspec(dllexport)int Min(int a, int b)
{
if(a>=b)
return b;
else
return a;
}
///:~
然后编译运行,会在debug目录下找到dllDemo.dll这个动态链接库。
下一步,在c#中调用。新建,项目,控制台应用程序。(注意是C#,不是C#环境您重新切一下),在Program.cs中贴入以下代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;//引入dll文件中的函数

class Program
{

//引入dll文件中的函数
[DllImport("dllDemo.dll")]
private static extern int Sum(int a, int b);
[DllImport("dllDemo.dll")]
private static extern int Max(int a, int b);
[DllImport("dllDemo.dll")]
private static extern int Min(int a, int b);

static void Main(string[] args)
{
int a = Sum(3, 5);
Console.WriteLine(a);
Console.WriteLine(Max(5,10));
Console.WriteLine(Min(12,25));
Console.ReadKey();//直接main里边最后加个Console.Read()不就好了。要按键才退出。
}
}
然后把你编译好的dllDemo.dll粘贴到工程的bin下的debug目录下(vs2008可能直接是debug目录,总之弄到debug目录下就好),运行系统。
OK,会出现一个什么栈不对称的错误,这是怎么回事呢?你把工程属性的框架改成.net framwork 2.0的,就好用啦。这个原因不用我解释了吧,无非就是驴唇不对马嘴啦。
解释:
我用的是运行中加载,这个学过编译原理或者操作系统就明白啦,这里不做赘述。函数声明的形式以及调用的形式想必楼主一定知道(网上都有),只不过是没有一个可运行的实例罢了,有什么的问题可以mail给我,305688944@qq.com。我每天都上扣的。
就烦条0o
2015-12-31 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部

c#通过DllImport调用c++编写的dll,通过下例说胆。

1、首先使用C++创建一个动态库项目,应用程序设置中选择“DLL”

示例代码:

#include "stdafx.h"
extern "C" __declspec(dllexport) int Add(int x, int y)
{
return x + y;
}
extern "C" __declspec(dllexport) int Sub(int x, int y)
{
return x - y;
}
extern "C" __declspec(dllexport) int Multiply(int x, int y)
{
return x * y;
}
extern "C" __declspec(dllexport) int Divide(int x, int y)
{
return x / y;
}

说明:

extern "C"
包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的(extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件
中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。);其次,被它修饰的目标是“C”的。而被extern
"C"修饰的变量和函数是按照C语言方式编译和连接的。

 __declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。

编译得到CPPDemo.dll。

2、使用C#调用这个DLL

  创建一个C#项目,新建一个CPPDLL类,在类中添加如下代码,就是把要用到的方法重新声明了一下:

public class CPPDLL
{
[DllImport("CSharpInvokeCPP.CPPDemo.dll")]
public static extern int Add(int x, int y);
[DllImport("CSharpInvokeCPP.CPPDemo.dll")]
public static extern int Sub(int x, int y);
[DllImport("CSharpInvokeCPP.CPPDemo.dll")]
public static extern int Multiply(int x, int y);
[DllImport("CSharpInvokeCPP.CPPDemo.dll")]
public static extern int Divide(int x, int y);
}

注意:

1) 记得要使用DllImport,要引用“System.Runtime.InteropServices”

2) 把CPPDemo中生成的DLL文件拷贝到CSharpDemo的bin目录下这样在项目中就可以使用DLL的方法了。使用方法如下所示:

int result = CPPDLL.Add(10, 20);

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
beyondsky_LT
2010-12-10
知道答主
回答量:17
采纳率:0%
帮助的人:7.9万
展开全部
HINSTANCE hinst=::LoadLibrary(Dll的名称);返回的是 dll函数的句柄
DLLWITHLIB pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, 调用Dll函数的函数名);返回Dll函数的地址
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式