是浪费时间还是有明显的&创建非托管DLL的.NET包装器的可衡量的好处?
更多信息:
答案 0 :(得分:3)
DLL有很多类
这是一个奇怪的问题,但缺少重要的细节。如果要从托管代码中使用这些类,那么您无选择,但要为它们编写C ++ / CLI包装器。只有C ++编译器才能正确构造它们。 P /调用构造函数在技术上是不可能的,虽然找到它的导出函数名称非常痛苦,但你无法猜测为该对象分配多少内存。只有C ++编译器知道。
写包装并不是很困难,它主要是机械的。您可以使用this answer中的链接找到有关它的更多详细信息。答案 1 :(得分:2)
优点:
缺点:
如果你可以包装DLL,然后提供一个更简单,更小的接口,只需要你需要的东西,那么它可能是值得的。
另外,我知道你说你无法控制DLL,但是如果可以的话,.lib的C ++ / CLI包装器在.NET中使用非托管代码是一种更好的方法(大多数情况下,这是对于那些看到这个问题的人,或者你可以获得访问权限。)
答案 2 :(得分:1)
我所知道的一些好处:
IntPtr
,这可能会给经验不足的开发人员带来麻烦和漏洞。答案 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包装器”。