是的,你可以在没有互操作库的情况下在.NET中创建一个COM对象。只要他们的COM对象实现了IDispatch(其中WScript.Shell),您可以轻松地调用它的方法和属性。
如果您使用的是.NET 4,那么动态类型会非常简单。如果没有,你将不得不使用反射来调用这些方法,这些方法可以工作,但不是很好。
.NET 4与动态
Type shellType = Type.GetTypeFromProgID("WScript.Shell");
dynamic shell = Activator.CreateInstance(shellType);
dynamic shortcut = shell.CreateShortcut(linkFileName);
shortcut.TargetPath = Application.ExecutablePath;
shortcut.WorkingDirectory = Application.StartupPath;
shortcut.Save();
.NET 3.5或更低具有反射
Type shellType = Type.GetTypeFromProgID("WScript.Shell");
object shell = Activator.CreateInstance(shellType);
object shortcut = shellType.InvokeMember("CreateShortcut",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
null, shell, new object[] { linkFileName });
Type shortcutType = shortcut.GetType();
shortcutType.InvokeMember("TargetPath",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty,
null, shortcut, new object[] { Application.ExecutablePath });
shortcutType.InvokeMember("WorkingDirectory",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty,
null, shortcut, new object[] { Application.StartupPath });
shortcutType.InvokeMember("Save",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
null, shortcut, null);
因以下错误而失败:80040154 –
我使用的是DN 3.5,不能使用动态:( –
它工作正常,谢谢。难以置信它太容易了! –