45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:在.net C#里调用非托管动态库函数dll的步骤

在.net C#里调用非托管动态库函数dll的步骤

2016-08-30 18:55:23 来源:www.45fan.com 【

在.net C#里调用非托管动态库函数dll的步骤

这里讲述的是C#调用标准动态库的问题,在我以前的文件中讲到过,C#调用Win32API,原理是一样的.这里我详细讲解用C写一个标准的动态库,然后让C#调用.(本篇适合初学者,中间没有任何冗余代码,简洁明了)
软件环境:VC6.0(当然其他版本的VC5也可以)
1.制作标准动态库
__declspec(dllexport)int__cdecladd(int,int);//这一句是声明动态库输出一个可供外不调用的函数原型.
intadd(inta,intb){//实现这个函数
returna+b;
}
以上简单3行代码,声明一个add的方法,输入参数是两个int参数,返回这两个数之和.保存为MyLib.c
然后执行编译命令.
H:/XSchool/C#-School/HowTo>cl/LDMyLib.c
Microsoft(R)32-bitC/C++OptimizingCompilerVersion12.00.8168for80x86
Copyright(C)MicrosoftCorp1984-1998.Allrightsreserved.

MyLib.c
Microsoft(R)IncrementalLinkerVersion6.00.8447
Copyright(C)MicrosoftCorp1992-1998.Allrightsreserved.

/out:MyLib.dll
/dll
/implib:MyLib.lib
MyLib.obj
CreatinglibraryMyLib.libandobjectMyLib.exp

确信有以上输出,说明编译成功生成了动态库.

2.编写C-Sharp程序调用该动态库
usingSystem;
usingSystem.Runtime.InteropServices;//这是用到DllImport时候要引入的包

publicclassInvokeDll{
[DllImport("MyLib.dll",CharSet=CharSet.Auto)]
staticexternintadd(inta,intb);//声明外部的标准动态库,跟Win32API是一样的.

publicstaticvoidMain(){
Console.WriteLine(add(10,30));
}
}
保存为InvokeDll.cs文件,与MyLib.dll置于同一目录,编译该文件.
H:/XSchool/C#-School/HowTo>cscinvokedll.cs
将生成Invokedll.exe,可以执行该文件.

--------------------------------------------------------------------------------------------------------------------------------------

 


								
C#.net 调用Dll 参数传递问题 [DllImport("k8110.dll")] static extern bool CAN_Init(long iIndex, ref Byte[] config);//把他转到C# //Public Declare Function CAN_Init Lib "k8110.dll" (ByVal iIndex As Long, ByRef config As Any) As Boolean /这个是vb 的代码 Byte[] Conf = new Byte[5]; Conf[0] = 1; Conf[1] = 2; Conf[2] = 3; Conf[3] = 4; Conf[4] = 5; OpenReturn = CAN_Init(0, ref Conf);//get a Error //Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 咋整!
 
  回复人:Mittermeyer(疾风之狼) 2006-04-29 09:22:00 得分:0
 
 
?

								
static extern bool CAN_Init(long iIndex, Byte[] config) OpenReturn = CAN_Init(0, Conf) 这样应该就可以了。
Top
 
  回复人:Ninputer(装配脑袋) 2006-04-29 09:27:00 得分:0
 
 
?

								
[DllImport("k8110.dll")] static extern int CAN_Init(int iIndex, [MarshalAs(UnmanagedType.LPArray)]Byte[] config); 好多类型都错了,数组和string绝对不能ref传递给API
 

本文地址:http://www.45fan.com/dnjc/69932.html
Tags: 动态 怎样 .net
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部