Type.GetTypeFromProgID () возвращает null, но New-Object работает в Powershell - PullRequest
1 голос
/ 08 мая 2020

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

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

enter image description here

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

0 голосов
/ 08 мая 2020

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

try
{
    var autoUpdateClass = Type.GetTypeFromProgID("Microsoft.Update.Auto­Update", true);
}
catch(Exception e)
{
   //check if any exception occured
}
...