目前我有一个PowerShell脚本,可以使用Shell.Application COMobject来获取我的控制面板中的程序列表。我需要将其转换为C#,但我似乎无法做到这一点。关于我做错了什么的任何建议?
下面显示的C#代码不会重新计算任何错误消息。它只是贯穿(因为它是空的)。当我从C#示例中删除if语句时,我得到"对象引用未设置为对象的实例。"。我知道我的文件夹变量是null但我不知道为什么?
在我的项目中添加了Shell32.Dll(C:\ Windows \ System32 \ shell32.dll)引用。 添加了Shell32 Using指令
(工作)PowerShell代码
$Shell = New-Object -ComObject Shell.Application
$folderName = "::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\" +
"::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");
$folder = $Shell.NameSpace($folderName)
if($folder)
{
$folder.Items()
}
(不工作)C#代码
Type t = Type.GetTypeFromProgID("Shell.Application");
Shell s = (Shell)Activator.CreateInstance(t);
var objNameSpace = s.NameSpace(@"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");
if (objNameSpace != null)
{
MessageBox.Show(objNameSpace.Items().Count.ToString());
}
(更多不工作)C#代码。第二种方法
Shell32.Shell shell = new Shell32.Shell();
Shell32.Shell objShell = shell.Application;
var objShellFolder = objShell.NameSpace(@"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");
if(objShellFolder != null)
{
MessageBox.Show(objShellFolder.Items().ToString());
}
答案 0 :(得分:0)
对于代码的Shell32
互操作版本,您需要将"shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}"
用于命名空间。