windows 是否可以在.net framework dll中使用powershell示例?

ycggw6v2  于 2023-05-30  发布在  Windows
关注(0)|答案(1)|浏览(203)

正如主题所说,我试图将这些来自Programatically Pin\UnPin the folder from quick access menu in windows 10的代码集成到.net framework dll中。
这是我的代码,它将抛出错误“公共语言运行时检测到无效程序”。

private void PinFolderToQuickAccess(string path)
{
    try
    {
        using (var runspace = RunspaceFactory.CreateRunspace())
        {
            runspace.Open();

            var ps = PowerShell.Create();
            var shellApplication =
                ps.AddCommand("New-Object").AddParameter("ComObject", "shell.application").Invoke();

            dynamic nameSpace = shellApplication.FirstOrDefault()?.Methods["NameSpace"].Invoke(path);
            nameSpace?.Self.InvokeVerb("pintohome");
        }
    }
    catch (Exception e)
    {
        Console.Error.WriteLine("Err: {0}", e);
    }
}

private void UnpinFolderFromQuickAccess(string path)
{
    try
    {
        using (var runspace = RunspaceFactory.CreateRunspace())
        {
            runspace.Open();
            var ps = PowerShell.Create();
            var removeScript =
                $"((New-Object -ComObject shell.application).Namespace(\"shell:::{{679f85cb-0220-4080-b29b-5540cc05aab6}}\").Items() | Where-Object {{ $_.Path -EQ \"{path}\" }}).InvokeVerb(\"unpinfromhome\")";

            ps.AddScript(removeScript);
            ps.Invoke();
        }
    }
    catch (Exception e)
    {
        Console.Error.WriteLine("Err: {0}", e);
    }
}

[TestMethod]
public void RemoveFromQuickAccess_WithAddFirst()
{
    QuickAccessHandler handler = new QuickAccessHandler();

    string testPath = @"C:\Users\hp\Downloads\Compressed";

    handler.RemoveFromQuickAccess(testPath);
}

我尝试了另一种解决方案Is it possible programmatically add folders to the Windows 10 Quick Access panel in the explorer window?
但这次它将停留在InvokeVerb("pintohome")

private void PinFolderToQuickAccess(string path)
{
    try
    {
        Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
        Object shell = Activator.CreateInstance(shellAppType);
        Shell32.Folder2 f = (Shell32.Folder2)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { path });
        f.Self.InvokeVerb("pintohome");
    }
    catch (Exception e)
    {
        Console.Error.WriteLine("Err: {0}", e);
    }
}

private void UnpinFolderFromQuickAccess(string path)
{
    try
    {
        Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
        Object shell = Activator.CreateInstance(shellAppType);
        Shell32.Folder2 f2 = (Shell32.Folder2)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { "shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}" });
        foreach (FolderItem fi in f2.Items())
        {

            if (fi.Path == path)
            {
                ((FolderItem)fi).InvokeVerb("unpinfromhome");
            }
        }
    }
    catch (Exception e)
    {
        Console.Error.WriteLine("Err: {0}", e);
    }
}

是否可以在.net framework dll中使用powershell示例?或者应该怎么样?

rjee0c15

rjee0c151#

总之,做这件事完全可以。
在我的例子中,这个问题有两个影响。
首先,我直接使用了System.Management.Automation,这是不推荐的。如果您使用的是.net framework,请改用Microsoft.PowerShell.5.ReferenceAssemblies
有关它的更多详细信息,您应该检查这个答案如何在同一台机器上自动化PowerShell或PowerShell Core。
第二,为了将所有引用嵌入到.exe文件中,我使用Costura.Fody来做这件事,这导致了一些意想不到的问题,比如很难运行我关于powershell示例的代码。不知道为什么,但只要删除它,然后一切顺利。

相关问题