2013-05-17 107 views
-1

我正在开发一个本机C++项目(/ clr启用),它必须使用一对托管的COM可见C#DLL。一些托管对象实现了IDisposable,我想对它们调用Dispose()。我怎样才能做到这一点?如何从C++/CLI中处理/删除管理对象

的代码看起来是这样的:

所有的
HRESULT hr = CoInitialize(NULL); 
IManagedClassPtr pIObj(__uuidof(ManagedClass)); 
//do stuff with pIObj 
... 
//dispose of pIObj somehow 
... 
CoUninitialize(); 
+0

你混合COM和C#CLR管理对象。 –

+0

确实。你会建议什么? –

+0

我相信'IDispose'是由终结器在C++/CLI中通过语言进行内在处理的。 –

回答

2

首先,如果你没有,只是不使用COM。

C++/CLI旨在为C++和.Net语言提供简单的接口。

如果要在C++/CLI中创建.Net对象,只需使用带参考变量的gcnew

。具有Dispose()方法的.Net类也将在C++/CLI中使用它。 The difference是,如果您在C++/CLI中声明ref类(.Net引用类),那么~destructor将变成Dispose方法。
!finalizer是GC实际调用的内容。

所以无论如何,如果你创建一个Dispose()方法.NET对象,你就可以做到这一点:

MyDisposable^ m = gcnew MyDisposable(); 
m->Dispose(); 
+1

我正在做的项目是一个COM模块。我的计划是尽可能少编写C++,并将所有功能保留在受管理的土地上。 COM模块本身应该是一个非常薄的层,它将COM接口与C#DLL连接起来。你的方法在这种情况下会起作用吗? –

+0

@AlexG。你不需要COM接口,除非你真的知道COM是如何工作的,以及它的所有缺点....你不需要C++ CLI来桥接COM,你可以将包含COM对象的DLL引用到C#项目中。 –

+0

好吧,我已经探索了C++/CLI方法,你说得对。这绝对是更清洁,更无忧无虑。谢谢! –