Получить GUID по имени типа - PullRequest
2 голосов
/ 10 февраля 2011

Так что я пытаюсь сделать вручную то, что делает AxImp (я делаю это динамически).

Мой продукт является широко распространенным, разрешенным «дополнением» к стороннему продукту. У них есть OCX, который я добавляю в форму со ссылкой на COM ... однако, если клиент имеет (или устанавливает) обновленную версию своего продукта, мой продукт больше не может загружать OCX.

Поэтому я пытаюсь загрузить их OCX динамически. У меня все работает, за исключением того, что мне нужен GUID одного из интерфейсов в одном из их OCX. Я знаю, что такое имя типа, и OCX> <зарегистрирован в системе. Как я могу получить GUID объекта только из имени типа? </p>

Обратите внимание, Assembly.LoadFrom () не работает, потому что OCX - это не .NET, а COM.

Ответы [ 3 ]

4 голосов
/ 10 февраля 2011

Поскольку ваш комментарий дал нам знать, что GUID найден в OCX, но не зарегистрирован под HKEY_CLASSES_ROOT, нам придется прочитать его из библиотеки типов:

  • Звоните LoadTypeLib или LoadTypeLibEx, передавая путь к файлу .OCX

  • Затем используйте метод FindName возвращаемого объекта.

  • Затем GetTypeAttr, а затем PtrToStructure, чтобы получить структуру TYPEATTR с GUID.

0 голосов
/ 10 февраля 2014

Мне пришлось написать что-то подобное для переноса кода из COM в C #

class GetGuid
{
    [DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    static extern int LoadTypeLib(string fileName, out ITypeLib typeLib);

    public string SearchRegistry(string dllPath /* or ocx */)
    {
        var result = string.Empty;
        ITypeLib tl;
        if (LoadTypeLib(dllPath, out tl) == 0)
        {
            ITypeInfo tf;
            tl.GetTypeInfo(0, out tf);

            var ip = IntPtr.Zero;
            tl.GetLibAttr(out ip);

            if (ip != IntPtr.Zero)
            {
                var ta = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR)Marshal.PtrToStructure(ip, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR));
                result = ta.guid.ToString();
            }
        }
        return result;
    }
}
0 голосов
/ 10 февраля 2011

Не уверен, почему вы не можете просто добавить COM-ссылку в DLL вашего проекта.

Visual Studio автоматически добавит оболочку .NET к любому COM-объекту, на который есть ссылкавот так.

...