2009-05-19 224 views
0

我有一个非托管C++ EXE,我可以从我的C#代码直接调用(具有C++代码,我可以做一个库)或通过产生一个进程,并从数据抓取的OutputStream。这些选项的优点和缺点是什么?从托管或产卵过程调用非托管代码

回答

0

刮掉OutputStream的一个很大的缺点是缺少数据类型。我宁愿做出导出一些函数和重用现有库的工作;但是,这只是一种偏好。

0

产生一个过程的另一个缺点是,在一个窗口中,一个过程是一个非常昂贵(慢)的操作。如果你打算经常调用C++代码,这是值得考虑的。 一个优势可能是,你自动更加孤立于C++程序中的崩溃。 更换C++可执行文件也是一个优点。 此外写入interop代码可以在c#中很麻烦。如果它是一个复杂的interace,并且您决定进行互操作,请查看interop层的C++/cli。

0

你最好将C++可执行文件的一部分功能集成到一个库中。您将保持类型安全性,并且您将能够更好地利用异常处理(更不用说更好地控制如何将调用管理到库中的函数中)。

如果您从可执行文件的OutputStream中获取数据,您将无法看到可执行文件的进程,没有真正的异常处理,并且您将丢失任何可能的类型信息有过。

1

由于您拥有C++库的源代码,因此可以使用C++/CLI将其编译为混合模式DLL,因此C#应用程序很容易使用它。

这样做的好处是在数据流(输入或输出到该C++模块)上最为灵活。

从进程中运行C++代码有一个好处。如果你的C++代码不是很健壮的话,这可以使你的主C#进程保持稳定,以免被C++代码崩溃。

0

在过程中的主要缺点是确保您正确处理托管/本地交互。

1)

C++代码可能会依赖于确定性的破坏进行清理/资源释放等我说可能是因为这是在C常见和良好做法++。

在托管代码中,这意味着您必须谨慎处理您的C++ cli包装代码。如果你的代码只用了一次,c#中的using子句会为你做这件事。如果对象需要一段时间作为成员,你会发现这个处理器需要通过你的应用程序进行链接。

2)

另一个问题取决于你的应用程序如何内存饥。托管垃圾收集器可能很懒。如果托管分配需要比可用空间更多的空间,则保证能够启动。然而,非托管分配器无论如何都没有连接。因此,您需要手动通知托管分配器您将进行非托管分配,并且应该保持该空间可用。这是使用AddMemoryPressure方法完成的。

退出的主要缺点是:

1)速度。

2)管理通信的代码开销。

3)代码开销监视一个或其他进程在不期望时死亡。