创建非托管DLL的.NET包装有哪些优点和缺点?
创建非托管DLL的.NET包装器是浪费时间还是有明显且可测量的好处 更多信息:创建非托管DLL的.NET包装有哪些优点和缺点?,.net,unmanaged,wrapper,.net,Unmanaged,Wrapper,创建非托管DLL的.NET包装器是浪费时间还是有明显且可测量的好处 更多信息: 我不控制DLL,但是我可以决定不使用最新版本替换它 DLL有许多类。和许多支持枚举 DLL为项目提供了关键功能 我知道的一些好处: 您可以将xmldoc放入托管包装器中,因此IDE中的所有开发人员都可以使用文档 您可以抽象掉所有的IntPtrs,这可能会给经验不足的开发人员带来麻烦和bug 您可以使用非托管DLL中的低级构建块为常见场景构建高级操作,从而降低出错的可能性。(当然,这并不特定于包装非托管DLL) 您可
- 我不控制DLL,但是我可以决定不使用最新版本替换它
- DLL有许多类。和许多支持枚举
- DLL为项目提供了关键功能李>
- 我知道的一些好处:
- 您可以将xmldoc放入托管包装器中,因此IDE中的所有开发人员都可以使用文档
- 您可以抽象掉所有的
s,这可能会给经验不足的开发人员带来麻烦和bugIntPtr
- 您可以使用非托管DLL中的低级构建块为常见场景构建高级操作,从而降低出错的可能性。(当然,这并不特定于包装非托管DLL)
您可以使用实现
的代码包装第三方代码使用的资源管理,这将允许使用.NET垃圾收集释放不再使用的资源(文件句柄等) 其他好处-几乎所有第三方代码的标准包括: 您正在将大部分代码与将来可能在第三方dll中发生的任何更改隔离开来。如果有任何更改,您只需更改包装器类中的实现。代码的其余部分保持不变 如果非托管代码中缺少缓存、验证和错误检查,您还可以在包装类中内置这些功能。优点:IDisposable
- 在.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类型的系统映射、内存管理、不同的线程模型、大量的技术资料作斗争,因为它很容易出错,而且不容易做到正确。