Почему я получаю дополнительное определение типа GUID при компиляции и импорте bits.idl?

Я пишу код .NET для COM BITS API. Я нашел файл bits.idl под окнами комплектов и сделал midl bits.idl, который дал мне bits.tlb. Затем я запустил tlbimp bits.tlb и получил BackgroundCopyManager.dll.

В этой сборке (на которую ссылается мой проект .net) все, как ожидалось, отображается в обозревателе объектов в VS 2013 и хорошо выглядит в ildasm, за одним исключением. Теперь у меня есть новый тип GUID в пространстве имен BackgroundCopyManager, который, как мне кажется, мне не нужен.

namespace BackgroundCopyManager
{
    public struct GUID
    {
        public uint Data1;
        public ushort Data2;
        public ushort Data3;
        public byte[] Data4;
    }
}

Я думал, что System.Guid будет достаточным для всех моих потребностей, связанных с GUID, CLSID и IID на стороне .NET. Можно как-нибудь избавиться от лишнего? Преобразование между System.Guid и этим самозванцем непросто, и, похоже, в этом нет необходимости.

Единственное, что я могу понять, это то, что в этих интерфейсах есть несколько методов, которые используют GUID в качестве типа параметра, и, поскольку этот файл idl относится к 2000 году, я предполагаю, что .NET Interop еще не существовал.


person Jay Carlton    schedule 03.03.2015    source источник


Ответы (1)


Вы только поверхностно касаетесь проблемы с IDL для BITS, ненужное объявление типа GUID - это лишь незначительная проблема. IDL никогда не разрабатывался для обеспечения совместимости с автоматизацией, он содержит слишком много cppquote () для важных объявлений и использует слишком много несовместимых типов, таких как LPWSTR. Это действительно работает только с C ++. Для того, чтобы преобразовать типы взаимодействия, которые вы получаете от Tlbimp, в форму, чтобы вы могли использовать их из управляемой программы, требуется существенный объем работы.

Как нетрудно догадаться, эта работа сделана. Лучшее, что я знаю, - это библиотека SharpBITS.NET. Самый простой способ получить - получить пакет Nuget.

person Hans Passant    schedule 03.03.2015