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