我想公开一个返回IEnumerable的方法,但是我无法通过C++代码来使用它。我读this SO的问题,但它是关于IEnumerator
而不是IEnumerable
。COM - 在C++中使用IEnumerable
[ComVisible(true),
Guid("myguid")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IDbReader
{
IEnumerable GetUsers();
}
[ComVisible(true),
Guid("myguid2")]
[ProgId("MyDbReader.DbReader")]
internal class DbReader : IDbReader
{
IEnumerable GetUsers() => new List<string>() { "User1", "User2" };
}
在C++:
#import "MyDbReader.tlb" named_guids raw_interfaces_only
...
CComPtr<IDbReader> myreader; // created through a factory
CComPtr<IEnumerable> users;
myreader->GetUsers(&users);
users->GetEnumerator(); // The compiler says: pointer to incomplete class is not allowed
此外,编译器看到IDbReader::IEnumerable
,而不是使用标准IEnumerable
。
我错过了什么?
感谢,
不幸的是,我需要使用'#import“CSharpLibrary.tlb”named_guids raw_interfaces_only'指令(没有标志我有> 60错误)。这样智能指针不会生成,但您仍然可以使用CComPtr等。我将更新问题。 –
peval27
顺便说一句,我错过了'使用命名空间mscorlib;'并且出于任何原因它无法正常工作。这是一个奇怪的错误消息,不能帮助用户解决问题。标记为答案 – peval27
Hmya,这是一种当编译错误不明确时最终会出现的下降螺旋。而且你有一个以上的错误,让它变得更加复杂。你不需要使用它。 –