2015-07-13 8 views
0

У меня есть структуры в виде службе WCF, определенные в C#, какWCF Com Interop GetRecordInfoFromGuids Возвращает старый формат или недопустимого тип библиотеку

[DataContract] 
    [StructLayout(LayoutKind.Sequential), Serializable] 
    [ComVisible(true)] 
    public struct MyData 
    { 
     [DataMember] 
     public int data1; 

     [DataMember] 
     public string data2; 
    } 

Из-приложения MFC Я пытаюсь создать небезопасный эту структуру. При вызове GetRecordInfoFromGuids как этот

hr = GetRecordInfoFromGuids(LIBID_MyLib, 1, 0, LOCALE_USER_DEFAULT, __uuidof(MyData), &pRI); 

Я получаю возвращаемое значение

0x80028019 Old format or invalid type library. 

Что не так с этим?

+0

Ну, он не очень доволен библиотекой типов, которую он нашел. Вы должны сообщить нам, как зарегистрирована библиотека C# и где вы получили LIBID_MyLib. Также используйте SysInternals Process Monitor, вы увидите, что он ищет библиотеку типов. –

+0

В Process Monitor я вижу, что он в точке вызова GetRecordInfoFromGuids имеет правильные директивные, основные и второстепенные версии и загружает правильную библиотеку типов. Я получаю LIBID из файла tlh, созданного из #import. Библиотека зарегистрирована как часть сборки с regasm – Jon49

+0

Я решил это. Смотри ниже. – Jon49

ответ

1

Мне удалось исправить это, и, когда я нашел 3 или 4 одинаковых вопроса, которые искали в Google, и никто из них не ответил, я подумал, что обновляю мои, поэтому у этого действительно было решение.

Оказалось, что элемент данных строкой по умолчанию был настроен как LPSTR. Мне никогда не приходило в голову, что это может быть проблемой, и на самом деле нет документации, чтобы заявить, что это может быть. Когда передается как один объект, проблем нет. Однако оказывается, что при передаче массива этих объектов член строки должен быть выстроен как BSTR. В противном случае вы получите ошибку в GetRecordInfoFromGuids, что библиотека типов недопустима. В действительности нет документации, которая подсказывает, что именно по этой причине этот вызов возвращает библиотеку типов недействительной. Я просто обнаружил проблему только путем проб и ошибок.

Так код выше просто нужно быть изменен в этом

[DataContract] 
    [Guid("xxx")] 
    [StructLayout(LayoutKind.Sequential), Serializable] 
    [ComVisible(true)] 
    public struct MyData 
    { 
     [DataMember] 
     public int data1; 

     [DataMember] 
     [MarshalAs(UnmanagedType.BStr)] 
     public string data2; 
    } 

Теперь GetRecordInfoFromTypeInfo преуспевает и я могу создать и успешно передать данные.