C++ 为静态库设计托管DLL(C+;+;/CLI)

C++ 为静态库设计托管DLL(C+;+;/CLI),c++,c++-cli,C++,C++ Cli,我正在为C库使用C++/CLI。我在网上探讨过这件事。我得到了几个关于它的链接 我正在开发一个C++/CLI DLL,它将包装一个C静态库 有一个建议,我真的想讨论的是“一个人不应该把管理和非托管C++代码混入包装器”。我不明白它的意思 托管DLL当然包含管理C++代码和非托管C++代码。 包装器的用途是将静态库中的调用转换为托管代码DLL 请澄清我的疑虑——我想对此进行评论。 < P>如果你有一个常规的C++库(非CLI),你应该避免打开那个库的CLI编译选项,因为性能原因。p> 相反,最好

我正在为C库使用C++/CLI。我在网上探讨过这件事。我得到了几个关于它的链接

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

有一个建议,我真的想讨论的是“一个人不应该把管理和非托管C++代码混入包装器”。我不明白它的意思

托管DLL当然包含管理C++代码和非托管C++代码。 包装器的用途是将静态库中的调用转换为托管代码DLL


请澄清我的疑虑——我想对此进行评论。

< P>如果你有一个常规的C++库(非CLI),你应该避免打开那个库的CLI编译选项,因为性能原因。p> 相反,最好创建一个只包含包装器类的库。这个库当然是C++/CLI,它将创建一个可被常规.Net库引用的程序集

因此,这可能就是建议所讨论的内容—为您的CLI包装器创建一个包装器库

--最新问题增编

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

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


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

您可能应该为您发现“一个应该混淆…”的地方添加URL。我仍然不清楚你在问什么。@JonathanLeffler更新了这个问题。你的URL(另一个问题)说“你不应该混合托管和非托管代码”,这与你引用的不同。缺少一个“not”可以完全破坏一个问题。@JonathanLeffler:是的,更新这个问题是我的错误。请澄清一下。我的C静态库没有clr。你的意思是说包装器也应该在没有clr选项的情况下编译。很抱歉,太晚了-我没有注意到你的评论。另一个库中的包装器也可能有/clr,因为大多数代码都是clr