为Static Lib设计托管DLL(C ++ / CLI)

时间:2011-10-21 05:01:12

标签: c++ c++-cli

我正在使用C ++的C ++ / CLI。我在网上探讨了它。我有几个关于它的链接。

Mixed mode C++/CLI performance considerations - best practices

我正在开发一个C ++ / CLI DLL,它将包装一个C静态库。

有一个建议,我真的想在这里讨论的是“不应该在包装器中混淆托管和非托管C ++代码”。我不明白它的含义。

托管DLL当然包含托管C ++代码和非托管C ++代码。

包装器的目的是将调用从静态库转换为托管代码DLL。

请清除我的疑虑 - 我想对此发表评论。

1 个答案:

答案 0 :(得分:2)

如果您有常规C ++库(非CLI),则出于性能原因,应避免为该库启用“CLI”编译选项。

相反,最好创建一个只包含您的包装类的库。该库当然是C ++ / CLI,并将创建一个可由常规.Net库引用的程序集。

这可能就是建议所要讨论的内容 - 为CLI包装器创建一个包装器库

- 更新问题的附录

托管C ++ / CLI类不应包含非托管代码,因为它/不能/包含许多类型的非托管代码。

例如,C ++ / CLI类不能包含任何非引用或非指针的非托管成员变量。这是因为.Net运行时垃圾收集器可能决定在任何时候将对象放在内存中的其他位置(这就是你需要固定内存等的原因)。如果GC决定将您的本机C ++对象移动到内存中的其他位置,这可能会使您对该对象的任何指针无效。这显然很糟糕。

C ++ / CLI是一门很棒的语言。但是,如果您使用它,则应该决定编写纯.Net代码,或者将其用作本机C ++和.Net之间的接口。在同一个类中混合使用内存模型只会让事情变得混乱。