下面是ad卡厂家提供的.h文件还有一个.lib但是打开都是二进制数。 我想在c#中操控ad卡 其实就是调用这里面的函数。 如何实现 如果需要生成dll 那么如何做 请详细一些 谢谢
注:本人vc不熟悉 熟悉c# 涉及到vc的方法能给予代码操作最好 再次感谢了 
#ifndef _PCI2007A_PARA_DA
typedef struct _PCI2007A_PARA_DA
{
LONG bEnableTimer0;  // 1:允许时钟0工作; 0:禁止时钟0工作;
LONG Frequency0;     // 时钟0输出频率
LONG bEnableTimer1;  // 1:允许时钟1工作; 0:禁止时钟1工作;
LONG Frequency1;     // 时钟1输出频率
LONG TriggerSource;  // 内触发和外触发方式选择
LONG OutTriggerEdge; // 外触发上升沿和下降沿类型选择
LONG bClockOutput;   // 是否允许时钟输出
LONG bImmediateClkOut;  // 是否立即启动定时器输出
LONG ClockOutputNum; // 选择哪一路时钟源作为输出(0:Timer0; 1:Timer1)
} PCI2007A_PARA_DA, *PPCI2007A_PARA_DA; 
#endif
//######################## 常量定义 #################################
//***********************************************************
// DA硬件参数PCI2007A_PARA_DA中的TriggerSource成员变量所使用DA启动触发源选项
#define PCI2007A_IN_TRIGGER  0x0000    // 内触发启动方式
#define PCI2007A_OUT_TRIGGER 0x0001    // 外触发启动方式//***********************************************************
// DA硬件参数PCI2007A_PARA_DA中的OutTriggerEdge成员变量所使用的触发沿方式选择控制字选项
#define PCI2007A_RISING_EDGE 0x0001    // 外触发上升沿触发方式
#define PCI2007A_FALLING_EDGE  0x0000  // 外触发下降沿触发方式//***********************************************************
// DA硬件参数PCI2007A_PARA_DA中的bClockOutput成员变量所使用内部和外部时钟源选项
#define PCI2007A_ENABLE_CLOCK_OUT   0x0001    // 允许本卡上的自带时钟向外输出
#define PCI2007A_DISABLE_CLOCK_OUT  0x0000    // 禁止本卡上的自带时钟向外输出//***********************************************************
// InitDeviceProDA函数中的ClockSource参数使用的时钟源选项
#define PCI2007A_IN_CLOCK0   0x0000    // 使用本设备上的内部时钟0
#define PCI2007A_IN_CLOCK1   0x0001    // 使用本设备上的内部时钟1
#define PCI2007A_OUT_CLOCK   0x0002    // 使用外部时钟// 用于DA各操作函数中的nDAChannel参数
#define PCI2007A_ALL_CHANNEL 0xFFFF      // 当需要对所有通道进行操作时//######################## 常量定义 #################################
// InitDeviceFile所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
#define PCI2007A_modeRead          0x0000   // 只读文件方式
#define PCI2007A_modeWrite         0x0001   // 只写文件方式
#define PCI2007A_modeReadWrite     0x0002   // 既读又写文件方式
#define PCI2007A_modeCreate        0x1000   // 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0//***********************************************************
// 用户函数接口
#ifndef DEFINING
#define DEVAPI __declspec(dllimport)
#else
#define DEVAPI __declspec(dllexport)
#endif#ifdef __cplusplus
extern "C" {
#endif
//######################## 常规通用函数 #################################
// 适用于本设备的最基本操作
DEVAPI HANDLE FAR PASCAL PCI2007A_CreateDevice(int DeviceID = 0);  // 创建设备对象
DEVAPI int FAR PASCAL PCI2007A_GetDeviceCount(HANDLE hDevice); // 取得设备总台数
DEVAPI BOOL PCI2007A_ListDeviceDlg(HANDLE hDevice); // 列表系统当中的所有的该PCI设备
    DEVAPI BOOL FAR PASCAL PCI2007A_ReleaseDevice(HANDLE hDevice); // 关闭设备,禁止传输,且释放资源 //####################### DA数据输出函数 #################################
// 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
// 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面其中几个函数便能轻
// 松实现高速、连续的DA数据输出
DEVAPI BOOL FAR PASCAL PCI2007A_ResetDeviceDA(    // 复位整个DA设备状态
HANDLE hDevice,   // 设备对象
PPCI2007A_PARA_DA pDAPara); // 复位参数 DEVAPI BOOL FAR PASCAL PCI2007A_SetDeviceFreqDA( // 动态设置DA的输出频率
   HANDLE hDevice,      // 管理DA对象的设备对象
   ULONG Frequency, // 时钟输出频率(Hz)
   int nTimerChannel);  // 时钟通道号(0或1) 

DEVAPI BOOL FAR PASCAL PCI2007A_ClearFIFODA( // 清除FIFO中的数据
   HANDLE hDevice, // 管理DA对象的设备对象
   int nDAChannel); // DA输出通道,取值范围为:0-3 DEVAPI BOOL FAR PASCAL PCI2007A_InitDeviceProDA(   // 初始化某个DA通道对象
 HANDLE hDevice,   // 管理DA对象的设备对象
 LONG ClockSource, // 时钟源选择,0:Timer0; 1:Timer1; 2或3:外时钟
 int nDAChannel);  // DA输出通道,取值范围为:0-3 DEVAPI BOOL FAR PASCAL PCI2007A_StartDeviceProDA( // 启动某个DA通道开始DA转换
HANDLE hDevice, // 管理DA对象的设备对象
int nDAChannel); // DA输出通道,取值范围为:0-3

DEVAPI BOOL FAR PASCAL PCI2007A_StopDeviceProDA( // 暂停某个DA通道进行DA转换
HANDLE hDevice, // 管理DA对象的设备对象
int nDAChannel); // DA输出通道,取值范围为:0-3 DEVAPI BOOL FAR PASCAL PCI2007A_GetDeviceStatusProDA( // 在DA输出过程中取得FIFO的状态
HANDLE hDevice, // 设备句柄
BOOL bNotEmpty[4], // 取得非空状态,TRUE表示已非空有效,FALSE表示非空无效
BOOL bHalf[4], // 取得半满状态,TRUE表示已半满有效,FALSE表示半满以下
BOOL bOverflow[4]); // 取得溢出状态,TRUE表示已溢出,FALSE表示未溢出 DEVAPI BOOL FAR PASCAL PCI2007A_WriteDeviceProDA( // 向DA的FIFO中写入批量数据(通常为FIFO的半满长度)
  HANDLE hDevice, // 管理DA对象的设备对象
  PLONG pDABuffer, // DA数据用户缓冲区
  ULONG nWriteSizeWords,// 写入的点数(以字为单位)
  int nDAChannel); // DA输出通道,取值范围为:0-3
  
DEVAPI BOOL FAR PASCAL PCI2007A_ReleaseDeviceProDA( // 停止DA转换,且释放DA资源
  HANDLE hDevice, // 管理DA对象的设备对象
  int nDAChannel); // DA输出通道

//################# 内存映射寄存器直接操作及读写函数 ########################
// 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
// 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。
DEVAPI BOOL FAR PASCAL PCI2007A_GetDeviceAddr( // 取得指定的指定设备ID号的映射寄存器的线性基地址,返回设备总数
HANDLE hDevice, // 设备对象句柄
PULONG LinearAddr, // 返回指定映射寄存器的线性地址
    PULONG PhysAddr, //  返回指定映射寄存器的物理地址
int RegisterID=0); // 设备映射寄存器的ID号(0-5)
    DEVAPI inline BOOL FAR PASCAL PCI2007A_WriteRegisterByte( // 往设备的映射寄存器空间指定端口写入单节字数据
HANDLE hDevice, // 设备对象
ULONG LinearAddr, // 指定映射寄存器的线性基地址
ULONG OffsetBytes,  // 相对于基地址的偏移位置
BYTE Value); // 往指定地址写入单字节数据(其地址由线性基地址和偏移位置决定)
DEVAPI inline BOOL FAR PASCAL PCI2007A_WriteRegisterWord( // 写双字节数据(其余同上)
HANDLE hDevice, 
ULONG LinearAddr, 
ULONG OffsetBytes,  
WORD Value);
DEVAPI inline BOOL FAR PASCAL PCI2007A_WriteRegisterULong( // 写四节字数据(其余同上)
HANDLE hDevice, 
ULONG LinearAddr, 
ULONG OffsetBytes,  
ULONG Value);
DEVAPI inline BYTE FAR PASCAL PCI2007A_ReadRegisterByte( // 读入单字节数据(其余同上)
HANDLE hDevice, 
ULONG LinearAddr, 
ULONG OffsetBytes);
DEVAPI inline WORD FAR PASCAL PCI2007A_ReadRegisterWord( // 读入双字节数据(其余同上)
HANDLE hDevice, 
ULONG LinearAddr, 
ULONG OffsetBytes);
DEVAPI inline ULONG FAR PASCAL PCI2007A_ReadRegisterULong( // 读入四字节数据(其余同上)
HANDLE hDevice, 
ULONG LinearAddr, 
ULONG OffsetBytes); //################# I/O端口直接操作及读写函数 ########################
// 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
// 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。
// 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备
    DEVAPI inline BOOL FAR PASCAL PCI2007A_WritePortByte(HANDLE hDevice, UINT nPort, BYTE Value);
    DEVAPI inline BOOL FAR PASCAL PCI2007A_WritePortWord(HANDLE hDevice, UINT nPort, WORD Value);
    DEVAPI inline BOOL FAR PASCAL PCI2007A_WritePortULong(HANDLE hDevice, UINT nPort, ULONG Value);    DEVAPI inline BYTE FAR PASCAL PCI2007A_ReadPortByte(HANDLE hDevice, UINT nPort);
    DEVAPI inline WORD FAR PASCAL PCI2007A_ReadPortWord(HANDLE hDevice, UINT nPort);
    DEVAPI inline ULONG FAR PASCAL PCI2007A_ReadPortULong(HANDLE hDevice, UINT nPort);    //######################### 文件操作函数 ##############################
    DEVAPI HANDLE FAR PASCAL PCI2007A_CreateFileObject(                    // 初始文件系统
  HANDLE hDevice,     // 设备对象
  LPCTSTR NewFileName,  // 新文件名
  int Mode);  // 文件操作方式    
    DEVAPI BOOL FAR PASCAL PCI2007A_WriteFile(      // 保存用户空间中数据
HANDLE hFileObject,  // 设备对象
PVOID pDataBuffer, // 用户数据空间地址
ULONG nWriteSizeBytes); // 缓冲区大小(字节)    DEVAPI BOOL FAR PASCAL PCI2007A_ReadFile(  // 读数据
  HANDLE hFileObject,     // 设备对象
  PVOID pDataBuffer, // 接受文件数据的用户内存缓冲区
  ULONG OffsetBytes,   // 从文件前端开始的偏移位置
  ULONG nReadSizeBytes); // 从偏移位置开始读的字节数 DEVAPI BOOL FAR PASCAL PCI2007A_SetFileOffset( // 设置文件偏移指针
  HANDLE hFileObject,   // 文件对象
  ULONG nOffsetBytes);  // 文件偏移位置(以字为单位)   DEVAPI ULONG FAR PASCAL PCI2007A_GetFileLength(HANDLE hFileObject); // 取得指定文件长度(字节)    DEVAPI BOOL FAR PASCAL PCI2007A_ReleaseFile(HANDLE hFileObject);
    DEVAPI ULONGLONG FAR PASCAL PCI2007A_GetDiskFreeBytes(               // 获得指定盘符的磁盘空间(注意使用64位变量)
      LPCTSTR DiskName);            // 盘符名,如C盘为"C:\\", D盘为"D:\\"
//########################### 线程操作函数 ######################################
DEVAPI HANDLE FAR PASCAL PCI2007A_CreateSystemEvent(void); // 创建内核事件对象,供InitDeviceInt和VB子线程等函数使用
DEVAPI BOOL FAR PASCAL PCI2007A_ReleaseSystemEvent(HANDLE hEvent); // 释放内核事件对象
DEVAPI BOOL FAR PASCAL PCI2007A_CreateVBThread(HANDLE *hThread, LPTHREAD_START_ROUTINE lpStartThread); // 创建VB子线程
    DEVAPI BOOL FAR PASCAL PCI2007A_TerminateVBThread(HANDLE hThreadHandle); // 释放VB子线程
DEVAPI BOOL FAR PASCAL PCI2007A_DelayTime(HANDLE hDevice, LONG nTime);  // 纳秒延时操作,不消耗CPU时间(Win9x下以毫秒作单位)
#ifdef __cplusplus
}
#endif

解决方案 »

  1.   

    说实话,我也不太懂,我只知道,把它编译成dll,然后在c#中用dllimport来调用。
    具体里面的代码,不太懂。罪过呀,罪过。
    关注下,学习了。
      

  2.   

    在C#里面调用WIN32DLL:
    http://blog.csdn.net/tangl_99/archive/2006/09/06/1182354.aspx
      

  3.   

    C#与C/C++类型对照表
    http://hi.baidu.com/songshu5555/blog/item/6a057d973c207f6154fb9677.html数据类型要转换才可以了。
      

  4.   

    把这个dll拷到bin目录下,然后引用这个dll,C#中代码[DllImport("dll文件名",EntryPoint="Add",ExactSpelling=false,CallingConvention=CallingConvention.Cdecl)]
    public static extern vc函数返回类型(这个地方要注意vc的类型和C#不同,不过你这个地方都是bool所以没问题) FunName(vc中的函数名)(参数);
      

  5.   


    VC++中生成DLL和LIB文件(2009-12-15 22:17:25)转载标签:vcdlllibit 分类:VC 1.概论  先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
      对动态链接库,我们还需建立如下概念:  (1)DLL 的编制与具体的编程语言及编译器无关  只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。  (2)动态链接库随处可见  我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。  一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。  (3)VC动态链接库的分类  Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。  非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。  由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。  问:本文主要讲解什么内容?  答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。  问:如何看本文?  答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。  当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握DLL的奥妙。  问:学习本文需要什么样的基础知识?  答:如果你掌握了C,并大致掌握了C++,了解一点MFC的知识,就可以轻松地看懂本文。  2.静态链接库  对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。 图1 建立一个静态链接库  如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下://文件:lib.h#ifndef LIB_H
    #define LIB_H
    extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数
    #endif//文件:lib.cpp#include "lib.h"
    int add(int x,int y)
    {
     return x + y;
    }
      编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。  标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。  下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:#include <stdio.h>
    #include "..\lib.h"
    #pragma comment( lib, "..\\debug\\libTest.lib" )  //指定与静态库一起连接int main(int argc, char* argv[])
    {
     printf( "2 + 3 = %d", add( 2, 3 ) );
    }
      静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "..\\debug\\libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。如果不用#pragma comment指定,则可以直接在VC++中设置,如图2,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。图2中加红圈的部分为我们添加的libTest.lib文件的路径。 图2 在VC中设置库文件路径  这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来的。我们现在有下列模糊认识了:  (1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;  (2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某种方式指明它要调用之。  以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。VC中DLL的创建及调用: 方法一:VC中DLL的创建及调用方法  
      此中只有实际才操作,而无相关理论  
       
      &sup2;             DLL的创建  
       
      首先,用VC集成开发界面中的“新建”,新建一个项目。无论是VC6.0还是VC.NET,都有建立DLL项目的选项。只不过有些稍有不同,例如VC.NET中就有ISAPI   DLL,扩展存储过程DLL等,这些都不在讨论的范围。例如我们建立了一个用静态连接MFC库的DLL项目,名称为mydll  
       
      然后,编辑mydll.cpp文件,在其中加入我们自己的函数void   go()。注意,不需要在mydll.h中声明它,而需要将函数头变成如下样子:  
       
      extern   “c”   __declspec(dllexport)   void   go()  
       
      {  
       
      //code……  
       
      }  
       
      dllexport表示这个函数是由外部调用的。  
       
      由于是否带参数,要影响到外部调用的方式,因此,我们再声明一个带参数的函数:  
       
      extern   “c”   __declspec(dllexport)   void   went(CString   str)  
       
      {  
       
      //code……  
       
      }  
       
      OK,下面编译连接形成mydll.dll文件。  
       
      &sup2;             DLL的调用  
       
      好,下面我们就用VC写个程序调用它。在调用的函数中,首先要获得DLL的句柄,有如下语句:  
       
      HINSTANCE           dllinstance;  
       
      dllinstance=::LoadLibrary(strDllUrl);  
       
      if(dllinstance==NULL)   AfxMessageBox("can't   open   dll   file");  
       
            其中strDllUrl是mydll.dll路径的字符串,这样程序才能找到它。::LoadLibrary获得参数标识的DLL文件的句柄。  
       
              获得句柄后,下面要获得函数地址以便执行它。有如下语句:  
       
              FARPROC     proc;  
       
              proc=GetProcAddress(dllinstance,"go");  
       
                if(proc==NULL)   AfxMessageBox("can't   find   function");  
       
                else   proc();  
       
      FARPROC是一个远程过程指针,通过GetProcAddress获得函数的地址。它的两个参数就是dll文件句柄和函数的名字了。  
       
      然后FARPROC就可以和go一样的使用了,它就是go   ,go   就是它。  
       
      而对于带参数的DLL中的函数,调用方法有所不同。因为对函数的调用是通过对它地址的引用进行的,这样,传入参数对不对,在函数调用程序的编译和联接过程中,无法知道其正确性。因此,要在调用程序中对DLL中带参数的函数做个声明,如mydll中的went,我们要做个声明如下:  
       
      typedef   void   (FAR   __cdecl   *MYWENT)(CString);  
       
      然后以类型MYWENT声明变量既可调用,如下:  
       
              MYWENT   myproc;  
       
              myproc   =(MYWENT)GetProcAddress(dllinstance,"go");  
       
                if(myproc   ==NULL)   AfxMessageBox("can't   find   function");  
       
                else   myproc   (“o-----yeah---------”);  
       
      注意声明的时候呢,由于DLL中WENT的定义为C语言调用规范,因此MYWENT前一定要用__cdecl,而VC中常用的__stdcall是PASCAL调用规范,不可以的。一定要注意。  方法二:New->MfcWiazard.dll   一路下去,就会生成一个了。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Joetao/archive/2009/05/09/4164276.aspx——————————————————————————————————————————————————————————————在VC中不用MFC如何制作dll方法一:使用export 和 import在VC中建立一个Console Application,建立2个文件:Dll.h 和 Dll.cppDll.h
    ========================================================
    #ifdef MYLIBAPI
    #else
    #define MYLIBAPI extern "C" _declspec (dllimport)
    #end ifMYLIBAPI int Add (int iLeft, int iRight)
    MYLIBAPI int Sub (int iLeft, int iRight)
    ========================================================Dll.cpp
    ========================================================
    #define MYLIBAPI extern "C" _declspec (dllexport)#include "Dll.h"int Add (int iLeft, int iRight)
    {
    return iLeft + iRight ;
    }int Sub (int iLeft, int iRight)
    {
    return iLeft - iRight ;
    }
    ========================================================保存文件。在Project->setting->link 最下面加上 “/dll”, "/"之前一定要与前一项有空格。然后编译,就可以在debug 或 release下面找到dll 和 lib 文件了使用的时候包含dll.h文件。方法二:使用def文件
    建立一个console application, 建立2个文件dll.h 和 dll.cppDll.h
    ========================================================
    int Add (int iLeft, int iRight) ;
    int Sub (int iLeft, int iRight) ;
    ========================================================Dll.cpp
    ========================================================
    #include "Dll.h"int Add (int iLeft, int iRight)
    {
    return iLeft + iRight ;
    }int Sub (int iLeft, int iRight)
    {
    return iLeft - iRight ;
    }
    ========================================================然后再当前目录下面建立一个.def文件,文件名最好和要输出的dll名字一样,扩展名为.def, 里面写上:LIBRARY dllname.dll
    EXPORTS
    Add @1
    Add @2
    然后将这个文件添加到工程中,在link中设置 /dll, 然后编译在debug或release中就可以找到dll和lib了
    使用的时候加上dll.h文件。再补充一点:
        dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译。而lib应该说是一个程序集,只是把一些相应的函数总结在一起,如果调用lib中的函数,在工程编译时,这些调用的函数都将参加编译
    lib是静态连编的。C#可能没办法直接使用。要先编译为dll。