Сбой комплекта сертификации приложений Windows с ошибкой: тип System.Type не найден - все типы, указанные в файлах метаданных, должны быть доступны для обнаружения

Я не могу пройти комплект сертификации приложений, потому что когда он запускает тест проверки метаданных среды выполнения Windows, он создает набор сообщений об ошибках, все они жалуются на тип System.Type:

> The type System.Type referenced by type
> ShapefileUniversal.__IFieldInfoPublicNonVirtuals in file C:\Program
>     Files\windowsapps\5b38d4f4.capturestreetsvirb360_1.0.0.0_x86__64b1t2me17ncm\ShapefileUniversal.winmd
> was not found. All types referenced in metadata files must be
> discoverable. The type System.Type referenced by type
> ShapefileUniversal.__IFieldInfoPublicNonVirtuals in file C:\Program
> Files\windowsapps\5b38d4f4.capturestreetsvirb360_1.0.0.0_x86__64b1t2me17ncm\ShapefileUniversal.winmd
> was not found. All types referenced in metadata files must be
> discoverable. The type System.Type referenced by type
> ShapefileUniversal.FieldInfo in file C:\Program
> Files\windowsapps\5b38d4f4.capturestreetsvirb360_1.0.0.0_x86__64b1t2me17ncm\ShapefileUniversal.winmd
> was not found. All types referenced in metadata files must be
> discoverable. The type System.Type referenced by type
> ShapefileUniversal.FieldInfo in file C:\Program
> Files\windowsapps\5b38d4f4.capturestreetsvirb360_1.0.0.0_x86__64b1t2me17ncm\ShapefileUniversal.winmd
> was not found. All types referenced in metadata files must be
> discoverable.

ShapefileUniversal - это компонент среды выполнения Windows, разработанный на C++/CX, а тип FieldInfo кодируется следующим образом:

public ref class FieldInfo sealed
{
public:
    property Platform::String^ Name;
    property Platform::Type^ Type;
    property uint8 Size;
};

В нем есть ссылка на Platform:: Type, но, проанализировав файл .winmd с помощью dotPeek или ILDasm, я понял, что он на самом деле транслируется в [mscorlib]System.Type, как вы можете увидеть в следующем фрагменте из вывода ILDasm:

.property instance class [mscorlib]System.Type
        Type()
{
  .set instance void ShapefileUniversal.FieldInfo::set_Type(class [mscorlib]System.Type)
  .get instance class [mscorlib]System.Type ShapefileUniversal.FieldInfo::get_Type()
} // end of property FieldInfo::Type

Анализируя манифест, компонент имеет ссылку на mscorlib:

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 255:255:255:255
}
.assembly windowsruntime ShapefileUniversal
{
  .hash algorithm 0x00008004
  .ver 255:255:255:255
}
.module ShapefileUniversal.winmd
// MVID: {F9F10CFE-F163-4405-8B7F-AEFF3EE1DD60}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x07430000

Поэтому я думаю, что все должно быть в порядке. Я не понимаю, почему ACK не может найти System.Type, используемый в WRC.

Компилятор (Visual Studio 2017 обновлен до 15.6.6), обновлены все пакеты NuGet, в проекте C++/CX - версия целевой платформы и минимальная платформа назначения. Версия 10.0.16299.0, и приложение работает правильно в отладке, выпуске, win32, x64, проблема только с WACK.

Заранее спасибо.

1 ответ

Решение

Вам нужно использовать тип Windows::UI::Xaml::Interop::TypeName как отмечено в MSDN:

TypeName является независимой от языка структурой среды выполнения Windows для представления информации о типе. Platform::Type специфичен для C++ и не может передаваться через двоичный интерфейс приложения (ABI).

Я удивлен, что компилятор C++ не жаловался на использование этого типа в публичном интерфейсе; похоже на ошибку.

Другие вопросы по тегам