在这个问题中被告知我的首选解决方案是不可能的之后,我现在正在尝试实施一种解决方法。我没有在 C++/CX 中声明从 IClosable 继承的接口,而是在原始 IDL 中声明它。但这似乎也不起作用。
我创建了一个 IDL 文件FooSpace.idl
,其中包含
import "inspectable.idl";
import "Windows.Foundation.idl";
namespace FooSpace
{
[uuid(01234567-89AB-CDEF-FEDC-BA9876543210)]
[version(42)]
interface Foo : IInspectable requires Windows.Foundation.IClosable
{
}
}
并从中生成 Windows 运行时元数据
midlrt /nomidl /metadata_dir "C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral" FooSpace.idl
当我用它反汇编它时,生成的FooSpace.winmd
看起来还不错ildasm
——特别是,它似乎以与 system-provided 中相同的方式Foo
继承自。IClosable
IInputStream
Windows.winmd
但是,当我尝试从 C++/CX 使用它时——甚至没有实现它,只是暂时假装其他人已经用 WRL 或其他方式实现了它——它似乎不起作用。这是我的测试 C++/CX 源文件:
void works(Windows::Storage::Streams::IInputStream^ istream) {
Platform::IDisposable^ local = istream ;
}
void doesnt(FooSpace::Foo^ foo) {
Platform::IDisposable^ local = foo ;
}
这会产生错误Foo
但不会产生错误IInputStream
:
C:\cygwin\tmp>cl /nologo /c /ZW /FU FooSpace.winmd testit.cpp
testit.cpp
testit.cpp(5) : error C2440: 'initializing' : cannot convert from 'FooSpace::Foo ^' to 'Platform::IDisposable ^'
No user-defined-conversion operator available, or
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
我在这里做错了什么?
另一方面,等效的 C# 代码似乎编译得很好:
public class Whatever {
public static void Works(Windows.Storage.Streams.IInputStream istream) {
System.IDisposable local = istream ;
}
public static void AlsoWorks(FooSpace.Foo foo) {
System.IDisposable local = foo ;
}
}