创建非托管DLL的.NET包装器的优缺点是什么?

时间:2010-11-28 16:18:55

标签: .net unmanaged wrapper

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

更多信息:

  • 我不控制DLL,但我决定不用最新版本替换它。
  • DLL有很多类。还有许多支持枚举。
  • DLL为项目提供关键功能。

6 个答案:

答案 0 :(得分:3)

  

DLL有很多类

这是一个奇怪的问题,但缺少重要的细节。如果要从托管代码中使用这些类,那么您无选择,但要为它们编写C ++ / CLI包装器。只有C ++编译器才能正确构造它们。 P /调用构造函数在技术上是不可能的,虽然找到它的导出函数名称非常痛苦,但你无法猜测为该对象分配多少内存。只有C ++编译器知道。

写包装并不是很困难,它主要是机械的。您可以使用this answer中的链接找到有关它的更多详细信息。

答案 1 :(得分:2)

优点:

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

    1. 这是很多工作
    2. 如果你可以包装DLL,然后提供一个更简单,更小的接口,只需要你需要的东西,那么它可能是值得的。

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

答案 2 :(得分:1)

我所知道的一些好处:

  1. 您可以将xmldoc放入托管包装器中,因此可以向IDE中的所有开发人员提供文档。
  2. 您可以抽象出所有IntPtr,这可能会给经验不足的开发人员带来麻烦和漏洞。
  3. 您可以使用非托管DLL中的较低级别构建块为常见方案构建更高级别的操作,从而减少出错的可能性。 (当然,这个不是特定于包装非托管DLL)。

答案 3 :(得分:1)

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

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

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

如果非托管代码中缺少任何这些内容,您还可以在包装类中构建缓存,验证和错误检查。

答案 4 :(得分:1)

优点:

1)如果算法处于非托管DLL中,则会有某种安全性;

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

缺点:

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

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

答案 5 :(得分:0)

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

编辑:好的,根据您的评论,DLL 已经一个COM Dll。那么你当然不再需要.NET包装器了。我的答案是针对这种情况,如果你有一个普通的原生C ++ DLL,其中使用COM意味着“添加一个COM包装器”。