创建非托管DLL的.NET包装有哪些优点和缺点?

创建非托管DLL的.NET包装有哪些优点和缺点?,.net,unmanaged,wrapper,.net,Unmanaged,Wrapper,创建非托管DLL的.NET包装器是浪费时间还是有明显且可测量的好处 更多信息: 我不控制DLL,但是我可以决定不使用最新版本替换它 DLL有许多类。和许多支持枚举 DLL为项目提供了关键功能 我知道的一些好处: 您可以将xmldoc放入托管包装器中,因此IDE中的所有开发人员都可以使用文档 您可以抽象掉所有的IntPtrs,这可能会给经验不足的开发人员带来麻烦和bug 您可以使用非托管DLL中的低级构建块为常见场景构建高级操作,从而降低出错的可能性。(当然,这并不特定于包装非托管DLL) 您可

创建非托管DLL的.NET包装器是浪费时间还是有明显且可测量的好处

更多信息:

  • 我不控制DLL,但是我可以决定不使用最新版本替换它
  • DLL有许多类。和许多支持枚举
  • DLL为项目提供了关键功能
      我知道的一些好处:

    • 您可以将xmldoc放入托管包装器中,因此IDE中的所有开发人员都可以使用文档
    • 您可以抽象掉所有的
      IntPtr
      s,这可能会给经验不足的开发人员带来麻烦和bug
    • 您可以使用非托管DLL中的低级构建块为常见场景构建高级操作,从而降低出错的可能性。(当然,这并不特定于包装非托管DLL)

    • 您可以使用实现
      IDisposable
      的代码包装第三方代码使用的资源管理,这将允许使用.NET垃圾收集释放不再使用的资源(文件句柄等)

      其他好处-几乎所有第三方代码的标准包括:

      您正在将大部分代码与将来可能在第三方dll中发生的任何更改隔离开来。如果有任何更改,您只需更改包装器类中的实现。代码的其余部分保持不变

      如果非托管代码中缺少缓存、验证和错误检查,您还可以在包装类中内置这些功能。

      优点:

    • 在.NET项目中使用DLL的功能要容易得多
    • 您可以编写自己的非托管DLL加载程序,这样就不必依赖LoadLibrary中的算法
    • 您可以稍后添加隔离,以便非托管DLL不在进程中
    • 缺点:

    • 这是一项艰巨的工作
    • 如果您可以包装DLL,然后还提供一个更简单、更小的接口来满足您的需要,那么它可能是值得的


      另外,我知道你说你不能控制DLL,但是如果可以的话,一个.lib的C++/CLI包装器是在.NET中使用非托管代码的更好的方法(大多数情况下,这是给其他看到这个问题的人,或者如果你可以访问的话)。

      如果你想在C#或VB.NET项目(或除C++/CLI以外的任何其他.NET语言)中使用这个DLL,我看不到任何合理的替代方案(前提是您不打算从头完全重新创建托管版本DLL)。当然,您可以使用COM,但在大多数情况下,从.NET客户机项目的角度来看,这将更加困难,需要做更多的工作,结果会更糟糕

      编辑:好的,根据你的评论,这个DLL已经是一个COM DLL了。当然,您不再需要.NET包装器。我的答案是针对这个例子,如果你有一个普通的老的本地C++ DLL,在这里使用COM意味着“添加一个COM包装器”。 DLL有许多类

      这是一个奇怪的问题,但缺少重要的细节。如果您想从托管代码中使用这些类,那么您别无选择,只能为它们编写一个C++/CLI包装器。只有C++编译器才能正确地构造它们。调用构造函数在技术上并不是不可能的,尽管查找其导出的函数名非常痛苦,但您无法猜测要为对象分配多少内存。只有C++编译器知道.< /p> 编写包装并不困难,它主要是机械的。您可以通过中的链接找到有关它的更多详细信息。

      Pros:

      1) 如果算法在非托管dll中,则算法具有某种安全性

      2) 防止GC瓶颈。完全控制记忆

      缺点:

      1) 如果要使用64位.Net环境,则必须同时支持非托管dll的32位和64位版本


      2) 必须在托管代码和非托管代码之间创建非常小的接口(桥接),以防止速度下降。有时这是不可能的

      好的,ChrisF,但是我可以选择不升级DLL。所以我没有这个问题。谢谢你的贡献,克里斯!怎样我可以直接在.NET项目中引用DLL。我也可以指向特定的函数而不引用它。嗯,那它一定是一个COM服务器。添加引用时,是否在生成目录中获得Interop.foo.dll?包装它们几乎没有任何意义。从来没有。不,你是对的,不是。所以你的答案是完全正确的。你能详细解释一下为什么这会更难,工作更多吗?多谢了,“更难”是一个相对的事情-可能是我个人的意见。但去年我已经做了大量的C++/CLI编程,封装了一个本地C++ C++ DLL,这是非常直接的。然而,在我看来,用MFC或ATL进行COM编程要困难得多。你必须与C++-to-COM类型的系统映射、内存管理、不同的线程模型、大量的技术资料作斗争,因为它很容易出错,而且不容易做到正确。