加载中…
个人资料
嚴謹的小翔叔
嚴謹的小翔叔 新浪个人认证
  • 博客等级:
  • 博客积分:0
  • 博客访问:14,880
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

C#调用DLL的一些略谈(2)

(2007-01-06 00:13:52)
分类: .NET开发
C#调用DLL的一些略谈(2)
 
DLL_HELL的说明:
 
状况1: 动态库没有尽到回溯相容的责任
    如果程序A调用的是1.0版本的动态库(X.dll), 而程序B调用的是2.0版本的动态库(X.dll), 因为程
序B开发时间比较晚, 结果程序B在安装到系统的时候, 2.0版本的X.dll也安装到了系统中, 而原来1.0的
版本被2.0所代替.
    在大部分情况下2.0向下兼容1.0的版本, 但是有时候也会出现不相容的情况. 此时程序A便无法正
常执行了,此种DLL Hell的起因是设计者, 原因在于动态库没有回溯的原则. (比如A原来在1.0在X.dll中
有的函数, 在更新到2.0的时候取消了, 此时DLL Hell就产生了)
 
状况2: 动态库尽到了回溯的责任,但是动态库本身出现了bug
    另外一种情况就是,2.0的版本向下兼容了,但是出现了程序A和X.dll一起运行的时候出现了问题.
程式 A 用 X 1.0
 (X 1.0) (原始版本)
 Public SetValue(ByVal Value As Integer)
        If Value < 0 Then
           Value = 0
        End If
        m_Value = Value
End Property
 
程式 B 用 X 2.0
  (X 2.0) (更新版本)
 Public SetValue(ByVal Value As Integer)
        'Fix the bug
        If Value < 0 Then
           Err.Raise Number:=APP_ERROR, Description:="Negative Value " (错误检测功能)
        End If
        m_Value = Value
End Property
 
    比如以上出现的问题, 开发人员编写的二进制的dll兼容了以下的版本,内部的GUID的方法名称和参
数都完全相同. 由于X1.0中有一个名字为value的属性名称, 但是次数为负数的时候,就会变成0. 但是确
不会出现错误信息. 这个做法后来发现是错误的,于是X2.0版本解决了value,一旦出现负数就报错.
    但是当X2.0用到A上面的时候,编译可以通过,但是运行就DOWN掉了. 所以要完善二进制的dll, 并且
向下兼容,不发生DLL_HELL的情况是非常困难和复杂的。
 
                                      
C#调用DLL文件时参数对应表
Wtypes.h中的非托管类型  非托管 C语言类型    托管类名               说明
HANDLE                  void*               System.IntPtr          32 位
BYTE                    unsigned char       System.Byte            8 位
SHORT                   short               System.Int16           16 位
WORD                    unsigned short      System.UInt16          16 位
INT                     int                 System.Int32           32 位
UINT                    unsigned int        System.UInt32          32 位
LONG                    long                System.Int32           32 位
BOOL                    long                System.Int32           32 位
DWORD                   unsigned long       System.UInt32          32 位
ULONG                   unsigned long       System.UInt32          32 位
CHAR                    char                System.Char            用 ANSI 修饰。
LPSTR                   char*               System.String 或
                                            System.StringBuilder   用 ANSI 修饰。
LPCSTR                  Const char*         System.String 或
                                            System.StringBuilder   用 ANSI 修饰。
LPWSTR                  wchar_t*            System.String 或
                                            System.StringBuilder   用 Unicode 修饰。
LPCWSTR                 Const wchar_t*      System.String 或
                                            System.StringBuilder   用 Unicode 修饰。
FLOAT                   Float               System.Single          32 位
DOUBLE                  Double              System.Double          64 位

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有