none
【C#/ASP.NET】winform、webform项目中调用dll文件的方法或区别? RRS feed

  • 问题

  • C#编写的winform项目。由于需要引用外部dll文件,于是乎我把dll文件放在了项目下的Bin目录下,通过“添加引用DLL”方式来把此dll文件引用进来。之后出现了一个问题:总是提示错误“未能添加dll,这不是com组件” 

     

    上网查了一下,大概意思是说这个dll文件是一个api 属于接口,无法使用引用添加,正确添加应使用[DllImport("imgMMPI.dll", CharSet = CharSet.Ansi, SetLastError = true)] public static extern bool DrawMMPI(string s);方法

    由于小弟是做webform项目的,很少解除winform项目。对于dll引用问题不是很了解。望请各位前辈指点一下。winform项目中调用dll文件方法和区别?小弟感激不尽!


    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    2010年11月19日 8:13

答案

  • DLL 分为托管和非托管两种,DLL 引用也分为静态引用和动态引用两种。

    托管 DLL:表示利用 .NET Framework 编译产生的类型库程序集。他是一个 PE 文件,但具备 CLR 头,运行此 DLL 需要 CLR Hosting。

    非托管 DLL:由本地代码直接编译产生的标准 COFF 格式的动态链接库,它是一个 PE 文件,运行此 DLL 不需要 CLR Hosting。非托管 DLL 有可以是 Win32 标准的,或者基于 COM 的。基于 COM 的库包含 COM 服务器的接口定义,和其他相关信息。

    DLL 的动态引用:指的是调用方通过某种途径,如 LoadLibrary,P/Invoke,DllImport,ComImport,CoCreateClass 等方法,动态的从其他 DLL 加载类型库/导出函数的方法,被引用的 DLL 不需要作为先决条件类运行程序,如果程序在运行中没有找到被引用的 DLL,则会报出文件不存在,或类型 CLSID 无效的错误。

    DLL 静态引用:指的是将被引用 DLL 中的类型信息,如 Metadata (托管),导出表,COM 类型库,TypeLib 等作为元数据“嵌入”到调用方应用程序中,应用程序启动时,该被引用的 DLL 必须被同时加载。Visual Studio 添加引用对话框中的引用,属于静态引用。Visual Studio 会自动为菲托管 DLL 导入类型库 (TypeLib)。


    Mark Zhou
    • 已标记为答案 jinwb1982 2010年11月20日 0:44
    2010年11月19日 14:09
  • dear
    不能引用的很有可能表示他是非.NET平台下开发的元件,这很有可能是C++所编译而成的元件(API),所以你必须用到DllImport来引用元件,这跟开发Winform或Web没关连。
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 jinwb1982 2010年11月20日 0:44
    2010年11月19日 15:18

全部回复

  • DLL 分为托管和非托管两种,DLL 引用也分为静态引用和动态引用两种。

    托管 DLL:表示利用 .NET Framework 编译产生的类型库程序集。他是一个 PE 文件,但具备 CLR 头,运行此 DLL 需要 CLR Hosting。

    非托管 DLL:由本地代码直接编译产生的标准 COFF 格式的动态链接库,它是一个 PE 文件,运行此 DLL 不需要 CLR Hosting。非托管 DLL 有可以是 Win32 标准的,或者基于 COM 的。基于 COM 的库包含 COM 服务器的接口定义,和其他相关信息。

    DLL 的动态引用:指的是调用方通过某种途径,如 LoadLibrary,P/Invoke,DllImport,ComImport,CoCreateClass 等方法,动态的从其他 DLL 加载类型库/导出函数的方法,被引用的 DLL 不需要作为先决条件类运行程序,如果程序在运行中没有找到被引用的 DLL,则会报出文件不存在,或类型 CLSID 无效的错误。

    DLL 静态引用:指的是将被引用 DLL 中的类型信息,如 Metadata (托管),导出表,COM 类型库,TypeLib 等作为元数据“嵌入”到调用方应用程序中,应用程序启动时,该被引用的 DLL 必须被同时加载。Visual Studio 添加引用对话框中的引用,属于静态引用。Visual Studio 会自动为菲托管 DLL 导入类型库 (TypeLib)。


    Mark Zhou
    • 已标记为答案 jinwb1982 2010年11月20日 0:44
    2010年11月19日 14:09
  • dear
    不能引用的很有可能表示他是非.NET平台下开发的元件,这很有可能是C++所编译而成的元件(API),所以你必须用到DllImport来引用元件,这跟开发Winform或Web没关连。
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 jinwb1982 2010年11月20日 0:44
    2010年11月19日 15:18