我有一个非托管C++ EXE,我可以从我的C#代码直接调用(具有C++代码,我可以做一个库)或通过产生一个进程,并从数据抓取的OutputStream。这些选项的优点和缺点是什么?从托管或产卵过程调用非托管代码
回答
刮掉OutputStream的一个很大的缺点是缺少数据类型。我宁愿做出导出一些函数和重用现有库的工作;但是,这只是一种偏好。
产生一个过程的另一个缺点是,在一个窗口中,一个过程是一个非常昂贵(慢)的操作。如果你打算经常调用C++代码,这是值得考虑的。 一个优势可能是,你自动更加孤立于C++程序中的崩溃。 更换C++可执行文件也是一个优点。 此外写入interop代码可以在c#中很麻烦。如果它是一个复杂的interace,并且您决定进行互操作,请查看interop层的C++/cli。
你最好将C++可执行文件的一部分功能集成到一个库中。您将保持类型安全性,并且您将能够更好地利用异常处理(更不用说更好地控制如何将调用管理到库中的函数中)。
如果您从可执行文件的OutputStream中获取数据,您将无法看到可执行文件的进程,没有真正的异常处理,并且您将丢失任何可能的类型信息有过。
由于您拥有C++库的源代码,因此可以使用C++/CLI将其编译为混合模式DLL,因此C#应用程序很容易使用它。
这样做的好处是在数据流(输入或输出到该C++模块)上最为灵活。
从进程中运行C++代码有一个好处。如果你的C++代码不是很健壮的话,这可以使你的主C#进程保持稳定,以免被C++代码崩溃。
在过程中的主要缺点是确保您正确处理托管/本地交互。
1)
C++代码可能会依赖于确定性的破坏进行清理/资源释放等我说可能是因为这是在C常见和良好做法++。
在托管代码中,这意味着您必须谨慎处理您的C++ cli包装代码。如果你的代码只用了一次,c#中的using子句会为你做这件事。如果对象需要一段时间作为成员,你会发现这个处理器需要通过你的应用程序进行链接。
2)
另一个问题取决于你的应用程序如何内存饥。托管垃圾收集器可能很懒。如果托管分配需要比可用空间更多的空间,则保证能够启动。然而,非托管分配器无论如何都没有连接。因此,您需要手动通知托管分配器您将进行非托管分配,并且应该保持该空间可用。这是使用AddMemoryPressure方法完成的。
退出的主要缺点是:
1)速度。
2)管理通信的代码开销。
3)代码开销监视一个或其他进程在不期望时死亡。
- 1. 从托管代码调用非托管代码的性能
- 2. C++ cli从非托管代码调用托管代码
- 3. 从托管代码调用非托管代码
- 4. 从非托管代码调用托管代码
- 5. 托管代码与非托管代码
- 6. 调试托管的.NET代码从非托管C++调用
- 7. 在调试托管代码时调试非托管代码
- 8. 从托管代码调用非托管DLL函数时出错
- 9. 从非托管调用托管代码时发生StackoverflowException
- 10. 调用从托管代码非托管方法
- 11. 如何使用托管代码从非托管代码?
- 12. DirectX托管或非托管?
- 13. 调试托管代码和非托管代码
- 14. 托管代码在非托管
- 15. 从非托管代码
- 16. 从非托管代码获取值到托管代码
- 17. 通多 - 从托管代码维数组非托管代码
- 18. 我如何从托管代码调用外部非托管应用程序?
- 19. 从托管C#应用程序中调用非托管代码的缺点
- 20. 从非托管代码调用托管.NET代码的最佳方式
- 21. 远程调试非托管代码
- 22. 非托管代码调用回调vb.net
- 23. 从非托管win32程序集DLL调用托管代码 - 崩溃
- 24. 托管代码和非托管代码之间的调用代码
- 25. 使用COM互操作从非托管代码调用托管代理
- 26. 使用托管代码中的非托管代码
- 27. 将非托管转换为托管过程中的托管
- 28. C#托管的dll调用或非托管的dll调用?
- 29. C#调用非托管代码
- 30. 允许托管环境中的托管代码回拨非托管代码