带有 C++/CLI 和 C# "as" 运算符的 COM 包装器
COM wrapper with C++/CLI and C# "as" operator
我正在用 C++/CLI 编写 COM 包装器,并且正在为如何解决问题而苦苦挣扎。
从 C# 端,我将调用如下代码:
var item = myWrappedObj.getSomeItem() as AnotherItem;
C++/CLI 托管端持有指向非托管对象的指针:
public ref class MyWrapped {
NativeType* unManagedEl;
public:
Object^ getSomeItem() { return unManagedEl->getSomeItem(); }
...
};
和 C++/CLI 非托管端完成这项工作,假设 returns 一个 IUnknown* 包装在一个 UnknownBase 本机 class
public class UnknownBase {
IUnknown* myEl;
public:
UnknownBase(IUnknown* el) { myEl = el; }
...
};
public class NativeType {
COMType* myEl;
public:
Object^ getSomeItem() {
IUnknown* el; myEl->getItemNative(&el); return UnknownBase(el);
}
};
现在,界面中有许多 "AnotherItem" 类型(上面的第一个代码部分),我正在考虑创建从 UnknownBase 派生的托管 + 非托管包装器等。然后呢?我如何获得 C# "as" 运算符的相应代码?从 MSDN 我了解到 dynamic_cast 是为 "as" 调用的相应运算符,但是包装了 IUnknown 指针后,我不能单独依赖 dynamic_cast。我只是试图找出 classes 的类型转换运算符是否会被 dynamic_cast 使用(这样我就可以在单独的类型转换运算符中手动检查类型相等性),但我认为它不是?
我在 C# 端有一个庞大的代码库,它使用编组 + tlbimp 接口,所以我试图保持接口完全相同(以替换 "from-the-dark-side&buggy"-编组接口),因此我想出了双重包装器(实际上,单独的命名空间等,以发挥更多魔力)。
我意识到我需要找出 IUnknown 类型是什么,并为它 gcnew 一个相应的托管类型(参考 class)。我简化了上面问题的代码,但通常它更像是下面的代码(int id 指的是正确的类型)。并且在上面的示例代码中有错误可能导致难以回答这个问题,我很抱歉。
而且,在非托管 class 和对象之间不存在转换^,因此尝试创建 UnknownBase(el) 是行不通的。
public class NativeType {
COMType* myEl;
public:
Object^ getSomeItem(int id) {
IUnknown* el;
myEl->getItemNative(id, &el);
switch(id) {
case 1: return gcnew AnotherItem(el);
case 2: return gcnew ...
}
}
};
我会尽快测试的。
我正在用 C++/CLI 编写 COM 包装器,并且正在为如何解决问题而苦苦挣扎。
从 C# 端,我将调用如下代码:
var item = myWrappedObj.getSomeItem() as AnotherItem;
C++/CLI 托管端持有指向非托管对象的指针:
public ref class MyWrapped {
NativeType* unManagedEl;
public:
Object^ getSomeItem() { return unManagedEl->getSomeItem(); }
...
};
和 C++/CLI 非托管端完成这项工作,假设 returns 一个 IUnknown* 包装在一个 UnknownBase 本机 class
public class UnknownBase {
IUnknown* myEl;
public:
UnknownBase(IUnknown* el) { myEl = el; }
...
};
public class NativeType {
COMType* myEl;
public:
Object^ getSomeItem() {
IUnknown* el; myEl->getItemNative(&el); return UnknownBase(el);
}
};
现在,界面中有许多 "AnotherItem" 类型(上面的第一个代码部分),我正在考虑创建从 UnknownBase 派生的托管 + 非托管包装器等。然后呢?我如何获得 C# "as" 运算符的相应代码?从 MSDN 我了解到 dynamic_cast 是为 "as" 调用的相应运算符,但是包装了 IUnknown 指针后,我不能单独依赖 dynamic_cast。我只是试图找出 classes 的类型转换运算符是否会被 dynamic_cast 使用(这样我就可以在单独的类型转换运算符中手动检查类型相等性),但我认为它不是?
我在 C# 端有一个庞大的代码库,它使用编组 + tlbimp 接口,所以我试图保持接口完全相同(以替换 "from-the-dark-side&buggy"-编组接口),因此我想出了双重包装器(实际上,单独的命名空间等,以发挥更多魔力)。
我意识到我需要找出 IUnknown 类型是什么,并为它 gcnew 一个相应的托管类型(参考 class)。我简化了上面问题的代码,但通常它更像是下面的代码(int id 指的是正确的类型)。并且在上面的示例代码中有错误可能导致难以回答这个问题,我很抱歉。
而且,在非托管 class 和对象之间不存在转换^,因此尝试创建 UnknownBase(el) 是行不通的。
public class NativeType {
COMType* myEl;
public:
Object^ getSomeItem(int id) {
IUnknown* el;
myEl->getItemNative(id, &el);
switch(id) {
case 1: return gcnew AnotherItem(el);
case 2: return gcnew ...
}
}
};
我会尽快测试的。