透明 发表于 2015-1-16 22:47:23

ASP.NET教程之关于C#中的DLLImport

前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。MSDN中对DllImportAttribute的注释是如许的:可将该属性使用于办法。DllImportAttribute属性供应对从非托管DLL导出的函数举行挪用所必须的信息。作为最低请求,必需供应包括出口点的DLL的称号。
并给了一个示例:
[DllImport("KERNEL32.DLL",EntryPoint="MoveFileW",SetLastError=true,
CharSet=CharSet.Unicode,ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
publicstaticexternboolMoveFile(Stringsrc,Stringdst);
上彀搜了一下,最多见的就是利用它来挪用WIN32的API,比方下面所示。大概挪用一下C或C++编写的DLL。
这器材没怎样用过。只是头几天溘然分派下一个一时的义务,做一个“泊车厂办理”的小器材,传闻是一个年夜干部的小孩子要弄这么个器材,那干部是公司的客户,会商正派事之余又奉求了我们做这么个小器材。个中用到了单片机摹拟车辆收支的一些旌旗灯号。
我对单片机一无所知,幸亏有人写好了轮询单片机的DLL,我尽管挪用,因为是C++写的,因而将DLL拷贝到BIN目次后(这DLLImport会从程序启动目次入手下手查找响应称号的DLL,未找到则转至system32下查找),用DllImport来挪用,但在这个过程当中碰到了几个成绩:
1.看了一下C++的代码,必要用到的只要三个办法:
boolOpenSerialPort1()
boolfnGetIO(unsignedchar&P1,unsignedchar&P2,unsignedchar&P3)
boolCloseSerialPort1()
因而就在本人的程序中写了:
usingSystem.Runtime.InteropServices;
……

publicstaticexternboolOpenSerialPort1();

publicstaticexternboolfnGetIO(refbyteP1,refbyteP2,refbyteP3);

publicstaticexternboolCloseSerialPort1();
但是程序在运转时不管怎样老是提醒“找不到出口点”,弄得懵了,只好上彀搜往,最初下了一个叫eXeScope的小软件,装完以后检察该DLL,公然如贴子中写的,DLL中的函数称号产生了变更,分离成了:
?OpenSerialPort1@@YA_NXZ
?fnGetIO@@YA_NAAE00@Z
?CloseSerialPort1@@YA_NXZ
将这些怪怪的称号代进到EntryPoin中,编译运转,没有成绩了。
2.但是接上单片机以后,成绩又来了,固然OpenSerialPort1前往的了局是true,但fnGetIO读出一数据满是0,按理应当是全1才对。来了一个同事,说归正有源码,把本来的DLL弄成尺度C的尝尝,尺度C不尺度C的我也没分明,让那人给改了一下,把编译以后的DLL拷到本人程序的BIN下,将EntryPoin换成一般的函数名,运转,这回是真的OK了。
读写.ini文件时,也会用到DllImport,不外如今.ini文件仿佛用得少了,上面是读写的程序:
{
publicstringpath;

privatestaticexternlongWritePrivateProfileString(stringsection,stringkey,stringval,stringfilePath);

privatestaticexternintGetPrivateProfileString(stringsection,stringkey,stringdef,StringBuilder
retVal,intsize,stringfilePath);
publicIniFile(stringINIPath)
{
path=INIPath;
}
publicvoidIniWriteValue(stringSection,stringKey,stringValue)
{
WritePrivateProfileString(Section,Key,Value,this.path);
}
publicstringIniReadValue(stringSection,stringKey)
{
StringBuildertemp=newStringBuilder(255);
inti=GetPrivateProfileString(Section,Key,"",temp,255,this.path);
returntemp.ToString();
}
}
网上关于DllImport的良多成绩是因为所调办法的参数对照庞大,如今我还没用到,看到一篇贴子,参数中带指针的,也先录上去,以备未来查用:
参数是用指针来猎取一个数组:IntGetData(byte*pBuffer)
pBuffer是数组的首地点,也就是说GetData会写pBuffer,pBuffer....pBuffer;
答曰:

PrivatestaticexternintGetValue(byte[]pValue);
假如是out参数,能够以下

PrivatestaticexternintGetValue(byte[]pValue);
c++是语言,其实C++和java的应用范围根本就不一样的。在java应用的领域内,c++是不合适的。所以微软才搞了C#和Java对抗。

愤怒的大鸟 发表于 2015-1-17 17:17:21

Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。

再现理想 发表于 2015-1-20 21:23:32

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

若天明 发表于 2015-1-30 05:32:48

是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。

分手快乐 发表于 2015-2-6 07:40:17

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

金色的骷髅 发表于 2015-2-15 17:18:52

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

第二个灵魂 发表于 2015-3-4 12:04:59

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

小妖女 发表于 2015-3-11 19:32:23

Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。

不帅 发表于 2015-3-19 09:56:31

平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。

深爱那片海 发表于 2015-3-27 18:15:42

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
页: [1]
查看完整版本: ASP.NET教程之关于C#中的DLLImport