Для приложения мы используем UPnP для обнаружения и регистрации устройств / сервисов (у нас есть серверная и клиентская часть).

Для обнаружения мы использовали http://managedupnp.codeplex.com/, который работал очень хорошо.

Для регистрации мы нашли некоторую библиотеку, но она была ОЧЕНЬ ошибочной (библиотека Intel с открытым исходным кодом), и теперь мы хотим использовать компонент COM и сделать на нем небольшую абстракцию C #.

Я нашел документацию: http: / /msdn.microsoft.com/en-us/library/windows/desktop/aa381805(v=vs.85).aspx, но у меня проблема.

Эта библиотека содержит только интерфейсы, и я не понимаю, как получить ее экземпляр. И я не могу найти ни одного примера / документации.

Итак, кто-нибудь знает, как зарегистрировать устройство / службу с помощью этого COM-компонента?

Спасибо!

ИЗМЕНИТЬ :

Я попытался сгенерировать dll C #:

midl /target NT51 /tlb "C:\upnphost.tlb" "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\upnphost.idl"
tlbimp upnphost.tlb

Но после импорта этой сгенерированной dll я получил только тот же интерфейс, что и раньше: /. Я на правильном пути, как мне это сделать?

2
J4N 1 Фев 2013 в 14:12
Составляющий класс - UPnPRegistrar, clsid 204810b9-73b2-11d4-bf42-00b0d0118b56. Вы найдете эту грубую работу в C #, для нее нет библиотеки типов. На самом деле это предназначено только для использования из кода C ++. Это технически возможно, если написать свою собственную [ComImport] версию интерфейсов и компонентного класса. Объявления SDK находятся в upnphost.idl. Лучше всего это делать в C ++ / CLI.
 – 
Hans Passant
1 Фев 2013 в 15:56
Это не вариант для моего предприятия :(, а класс клиента доступен непосредственно в C # с управляемым кодом, нет? Какие варианты использования его в C #?
 – 
J4N
1 Фев 2013 в 16:03
SO не очень хорошее место, чтобы задавать вопросы, когда вам не разрешено писать код. Наверное, наймите подрядчика.
 – 
Hans Passant
1 Фев 2013 в 16:19
?? Мне разрешено, но не на c ++, я должен сделать это на c #
 – 
J4N
1 Фев 2013 в 16:30
Любой способ сделать какой-нибудь ComImport (или сгенерировать их один раз?)
 – 
J4N
1 Фев 2013 в 16:39

1 ответ

Лучший ответ

После того, как вы выполнили midl + tlbimp, вы можете просто написать такой код, поскольку tlbimp должен создать класс (UPnPRegistrarClass) и интерфейс IUPnPRegistrar, которые реализует базовый COM-класс:

IUPnPRegistrar registrar = (IUPnPRegistrar)new UPnPRegistrarClass();
registrar.RegisterDevice(
    File.ReadAllText("DimmerDevice-Desc.xml"),
    "My.Class",
    "MyInitString",
    "MyContainerId",
    Path.GetFullPath("."),
    3200);

Примечание. Чтобы это работало, загрузите образец регистрации устройства UPnP на свой disk и скопируйте два файла описания XML в текущий путь выполнения. Вы также должны реализовать COM-объект с прогидом ("My.Class", который работает, потому что вызов RegisterDevice действительно создаст экземпляр этого объекта для построения идентификатора. Это можно сделать с помощью .NET.

Форматы описания устройств и услуг доступны здесь: Архитектура устройства UPnP ™ 1.1 < / а>. В мире Windows здесь указаны некоторые дополнительные ограничения: Создание описания устройства (Windows)

2
Simon Mourier 6 Фев 2013 в 18:19
Если я сделаю это, я получу точно такой же результат, как если бы я использовал классы / интерфейсы, доступные с UPnPLibHost. И я получаю это исключение: Interop type 'UPnPHostLib.UPnPRegistrarClass' cannot be embedded. Use the applicable interface instead.
 – 
J4N
5 Фев 2013 в 18:10
1
Для этой ошибки просто перейдите к ссылке UPnPHostLib в обозревателе решений VS, нажмите F4 (Свойства) и установите для свойства «Embed Interop Types» значение «False». Вы не упомянули UPnPLibHost. Что это?
 – 
Simon Mourier
5 Фев 2013 в 19:44
Кажется, работает, но есть ли у вас пример XML, который я должен разместить здесь? Объявить устройство + одно действие? Потому что я попробовал и получил какое-то исключение (FileNotFoundException)
 – 
J4N
6 Фев 2013 в 13:25
1
Что ж, вы должны иметь возможность определить это самостоятельно, так как вы хотите зарегистрировать устройство :-) Обратитесь к документации UPnP. Примеры представлены здесь: upnp.org/sdcps-and-certification/standards/sdcps < / а>
 – 
Simon Mourier
6 Фев 2013 в 13:47
Да, но в моем случае это не мультимедийное устройство, поэтому оно не подходит ни к одной из этих категорий. В базовом устройстве есть только <device></device>, что мне не очень помогает. Я пытался создать свой, но что-то упустил. Есть ли инструменты для создания этого XML-файла? И есть дополнительный параметр (кроме XML), я не уверен, что понимаю, для чего они нужны.
 – 
J4N
6 Фев 2013 в 15:29