2011-03-12 13 views
1

我用下面的方法托管.NET库在我的C++程序,虽然不是一个详尽的列表:需要使用.NET支持复制IDispatch *;不知道类名

CorBindToRuntimeEx() 
GetDefaultDomain() 
CreateInstance() 
Invoke() 

我必须对应于.NET类C++类。每个类实例都包含一个CComPtr<IDispatch>,我用它来调用函数和获取/设置成员变量。

这工作正常,除了我拷贝我的C++类时,我最终得到了两个指向同一个.NET实例的C++类实例。当我在一个实例中更改变量值时,它会反映在另一个实例中。

所以,我真的很想复制我的IDispatch指针,以便每个C++类实例都有一个唯一的.NET类实例。我可以拨打CreateInstance(),但由于各种原因,找出图书馆和班级名称很不方便。

TL;博士
我如何可以复制我的.NET支持的IDispatch指针头也不抬类/库的名称?

谢谢!

+0

一般来说,这是一个坏主意(TM)从非托管代码使用.NET;另一种方式很好。但是,您可以检查.NET对象是否支持ICloneable,如果是,则使用它来克隆它。更好的是,如果您绝对必须这样做,那么通过声明私有或受保护的副本构造函数和复制赋值运算符,可以使您的C++实例不可复制。 – 2011-03-12 03:21:36

+0

嗯,我已经做到了。除了复杂性和低效率之外,为什么它不是一个好主意?我显然不是从本地代码中使用.NET来获得乐趣。 – David 2011-03-17 00:44:19

+0

除了复杂性和低效率以外,还可以。它就像从5公里自由降落到地球一样,除了最终的影响外,还可以。 :-) – 2011-03-17 00:54:43

回答

3

这是预期的行为,CComPtr拷贝构造函数将简单地复制接口指针并添加一个带有AddRef()的引用。在COM和.NET中都没有自动创建深层副本的机制。这与C++没有根本的区别。在.NET中定义了一个众所周知的接口ICloneable。它几乎不会被弃用,界面没有办法让调用者指定需要深拷贝而不是浅拷贝。让它旁边无用,很少实施。无论如何,这里没有任何帮助,COM没有类似的东西。

不,你必须保持足够的状态并编写代码来创建一个新的对象。请检查您对此的需求。如果您只是为了创建COM对象(及其底层.NET对象)的副本而将C++对象复制,那么您可能不应该创建该副本。

+0

谢谢你的详细解答。 – David 2011-03-14 17:10:47