1

我正在使用以下方法在我的 C++ 程序中托管一个 .NET 库,但不是一个详尽的列表:

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

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

这很好,除了当我复制我的 C++ 类时,我最终得到两个 C++ 类实例,它们都指向同一个 .NET 实例。当我在一个实例中更改变量值时,它会反映在另一个实例中。

所以,我真的很想复制我的 IDispatch 指针,这样每个 C++ 类实例都有一个唯一的 .NET 类实例。我可以打电话CreateInstance(),但由于各种原因,找出库和类名很不方便。

tl;dr
如何在不查找类/库名称的情况下复制我的 .NET 支持的 IDispatch 指针?

谢谢!

4

1 回答 1

3

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

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

于 2011-03-12T03:46:38.340 回答