Type.GetTypeFromProgID() возвращает null, но New-Object работает в Powershell

Я пытаюсь создать экземпляр COM-объекта Microsoft.Update.AutoUpdate на С#. Это работает в PowerShell:

$AutoUpdates = New-Object -ComObject "Microsoft.Update.AutoUpdate"

Однако это не работает в С#:

var autoUpdateClass = Type.GetTypeFromProgID("Microsoft.Update.Auto­Update");
// var autoup = Activator.CreateInstance(autoUpdateClass) as IAutomaticUpdates;

В этом случае autoUpdateClass равно нулю. Есть ли способ активировать экземпляр этого класса? Может быть, мне нужно вручную указать DLL или обеспечить правильную разрядность моего процесса?

Рабочей альтернативой было бы добавить ссылку на WUApiLib.dll и установить для параметра «Встроить типы взаимодействия» значение false. Тогда я могу просто сделать new AutoUpdateClass(). Недостатком является то, что у меня есть дополнительный Interop.WUApiLib.dll, а также люди рекомендуют "никогда не делайте этого". В любом случае, я хотел бы знать, почему GetTypeFromProgID здесь не работает.


person jdm    schedule 07.05.2020    source источник
comment
Кажется, это ничего не меняет. Я также попытался установить целевую платформу на x64 или x86, но это не помогло.   -  person jdm    schedule 08.05.2020


Ответы (2)


Поскольку у вас есть специальный символ Юникода между «Авто» и «Обновить», которого у вас, вероятно, нет в вашем скрипте powershell, если вы вставите свой код в блокнот, он отобразит это:

введите здесь описание изображения

PS: в наши дни все больше и больше людей сталкиваются с такими скрытыми проблемами с символами, не знаю почему...

person Simon Mourier    schedule 08.05.2020
comment
Спасибо, невероятно, что вы это заметили! Я специально скопировал строку из сообщения в блоге, потому что в моей первой попытке была другая ошибка, и я хотел избежать опечатки. Полагаю, это была ошибка... - person jdm; 08.05.2020
comment
На самом деле существует расширение VS для выделения таких проблем: marketplace.visualstudio.com/< /а> - person jdm; 08.05.2020

Исключение возможно. Проверьте с помощью следующего кода:

try
{
    var autoUpdateClass = Type.GetTypeFromProgID("Microsoft.Update.Auto­Update", true);
}
catch(Exception e)
{
   //check if any exception occured
}
person Silviu Berce    schedule 07.05.2020
comment
подсказка: это должен быть (очень действительный) комментарий, а не ответ - person Simon Mourier; 08.05.2020