我想公開一個返回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,這是一種當編譯錯誤不明確時最終會出現的下降螺旋。而且你有一個以上的錯誤,讓它變得更加複雜。你不需要使用它。 –