关于C#创建桌面快捷方式的问题

seeto 2015-08-05 08:29:25
在网上看到vb.net可以不在菜单引用com,而直接用CreateObject调用com对象,生成的程序不需要带上Interop.IWshRuntimeLibrary.dll,请问这个在C#怎么做?

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' 直接调用COM对象
Dim wsh As Object = CreateObject("WScript.Shell")
Dim desk As String = wsh.SpecialFolders("Desktop")
Dim lnk As Object = wsh.CreateShortcut(desk & "\说明2.lnk")

With lnk
.Arguments = "/?" '传递参数
.Description = "我是直接调用COM创建的非托管对象创建的快捷方式!"
.Ic '调用dll资源内的图标,索引在第23个图标,问号帮助
.TargetPath = Application.StartupPath & "\乐博网.txt"
.WindowStyle = 7 '打开窗体的风格,最小化
.WorkingDirectory = Application.StartupPath '工作路径
.Save() '保存快捷方式
End With

End Sub
...全文
459 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
seeto 2015-08-19
  • 打赏
  • 举报
回复
引用 9 楼 q317379184 的回复:
创建快捷方式c#有自己的方法。为什么要调用其他的DLL
就是啊! 请问有没有例子程序?
random_2011 2015-08-19
  • 打赏
  • 举报
回复
创建快捷方式c#有自己的方法。为什么要调用其他的DLL
seeto 2015-08-19
  • 打赏
  • 举报
回复
引用 6 楼 crystal_lz 的回复:
[quote=引用 5 楼 crystal_lz 的回复:] 如果我没有猜错的花 lnk 不也是文本文件吗。。
好吧 我说错了 lnk 并不是文本文件 看了一下他的文件格式 也不复杂 给你找了一片文章http://blog.csdn.net/testcs_dn/article/details/8674265 貌似你也可以 生成一个vbs脚本去执行。[/quote] 这篇文章好像也需要引用Interop.IWshRuntimeLibrary.dll的,但如果不引用Interop.IWshRuntimeLibrary.dll要怎么做呢? 我在百度百科看到一个方法: http://baike.baidu.com/link?url=Kq3mWim7toTka_UFvWjKKWiVx0jdh_RE_EfKGaX3Ulkn-C2Wv1xXfSLRgDHYUetgKNm8x55LBq-X8dBzZNH1ma C#中的调用方式 编辑 C#中类似 CreateObject 的方法就是 System.Activator.CreateInstance. 后续的对象函数的调用可以通过InvokeMember方法来实现。 如在VB中的源代码如下: Public Sub TestLateBind() Dim o As Object = CreateObject("SomeClass") o.SomeMethod(arg1, arg2) w = o.SomeFunction(arg1, arg2) w = o.SomeGet o.SomeSet = w End Sub 转换成C#的代码如下所示: public void TestLateBind() { System.Type oType = System.Type.GetTypeFromProgID("SomeClass"); object o = System.Activator.CreateInstance(oType); oType.InvokeMember("SomeMethod", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] {arg1, arg2}); w = oType.InvokeMember("SomeFunction", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] {arg1, arg2}); w = oType.InvokeMember("SomeGet", System.Reflection.BindingFlags.GetProperty, null, o, null); oType.InvokeMember("SomeSet", System.Reflection.BindingFlags.SetProperty, null, o, new object[] {w}); } 里面有方法,属性的调用设定,很简单。 实际例子如下,调用Office功能的: public void TestLateBind() { System.Type wordType = System.Type.GetTypeFromProgID( "Word.Application" ); Object word = System.Activator.CreateInstance( wordType ); wordType.InvokeMember( "Visible", BindingFlags.SetProperty, null, word, new Object[] { true } ); Object documents = wordType.InvokeMember( "Documents", BindingFlags.GetProperty, null, word, null ); Object document = documents.GetType().InvokeMember( "Add", BindingFlags.InvokeMethod, null, documents, null ); } 这种Activator.CreateInstance方法还可以用来创建实例,并调用某些接口方法。毕竟接口必须要实例才能调用。 但由于本人C#只是小白,还不能完全看懂,也不会怎么把这代码应用到创建桌面快捷方式上,请各位高手给出例子。谢谢!
seeto 2015-08-19
  • 打赏
  • 举报
回复
引用 4 楼 slyzly 的回复:
网上找下这个dll文件,Interop.IWshRuntimeLibrary.dll,添加到项目中

string desktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);//得到桌面文件夹
            //创建桌面快捷方式
            if (chkCreateDesktopLnk.Checked == true)
            {
                if (!File.Exists(desktopPath + "\\程序名称.lnk"))
                {
                    string target = Application.ExecutablePath;
                    IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShellClass();
                    IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(desktopPath + "\\程序名称.lnk");
                    shortcut.TargetPath = target;
                    shortcut.Arguments = "";// 参数
                    shortcut.Description = "程序描述信息";
                    shortcut.WorkingDirectory = Application.StartupPath;//程序所在文件夹,在快捷方式图标点击右键可以看到此属性
                    shortcut.IconLocation = target + ",0";//图标
                    //shortcut.Hotkey = "";//热键CTRL+SHIFT+Z
                    shortcut.WindowStyle = 1;
                    shortcut.Save();
                }
            }
            else
            {
                if (File.Exists(desktopPath + "\\程序名称.lnk"))
                    File.Delete(desktopPath + "\\程序名称.lnk");
            }
哥们,请看我的需求,就是不想带上Interop.IWshRuntimeLibrary.dll,带上这个DLL的话就简单了,网上的例子也很多,但是既然vb.net 都有能不带Interop.IWshRuntimeLibrary.dll的方法,我觉得C#也肯定有这样的方法。
seeto 2015-08-19
  • 打赏
  • 举报
回复
引用 13 楼 q317379184 的回复:
[quote=引用 12 楼 seeto 的回复:] [quote=引用 11 楼 q317379184 的回复:] [quote=引用 10 楼 seeto 的回复:] [quote=引用 9 楼 q317379184 的回复:] 创建快捷方式c#有自己的方法。为什么要调用其他的DLL
就是啊! 请问有没有例子程序?[/quote] http://www.cnblogs.com/08shiyan/archive/2011/09/29/2195633.html[/quote] 你的这个例子我已经看过了,就和上面有朋友说的一样,需要调用Interop.IWshRuntimeLibrary.dll,你发的链接的原文也说了: 缺点: 用这种方法写的程序,必须有Interop.IWshRuntimeLibrary.dll跟着, 链接中的第二种方法是调用一个vbs文件,也不是C#自己的方法。 C#自己的方法是我在8楼说的,百度百科查出来的C#中类似 CreateObject 的方法就是 System.Activator.CreateInstance. 后续的对象函数的调用可以通过InvokeMember方法来实现。可惜我C#只是小白,没能搞得懂。[/quote] 请参考http://blog.csdn.net/q317379184/article/details/47781467[/quote] 先赞一个,动态调用COM组件WSH去创建快捷方式,无多余dll,要的就是这个,不过不是一般的复杂,得慢慢研究,一会测试能不能用。
random_2011 2015-08-19
  • 打赏
  • 举报
回复
引用 12 楼 seeto 的回复:
[quote=引用 11 楼 q317379184 的回复:] [quote=引用 10 楼 seeto 的回复:] [quote=引用 9 楼 q317379184 的回复:] 创建快捷方式c#有自己的方法。为什么要调用其他的DLL
就是啊! 请问有没有例子程序?[/quote] http://www.cnblogs.com/08shiyan/archive/2011/09/29/2195633.html[/quote] 你的这个例子我已经看过了,就和上面有朋友说的一样,需要调用Interop.IWshRuntimeLibrary.dll,你发的链接的原文也说了: 缺点: 用这种方法写的程序,必须有Interop.IWshRuntimeLibrary.dll跟着, 链接中的第二种方法是调用一个vbs文件,也不是C#自己的方法。 C#自己的方法是我在8楼说的,百度百科查出来的C#中类似 CreateObject 的方法就是 System.Activator.CreateInstance. 后续的对象函数的调用可以通过InvokeMember方法来实现。可惜我C#只是小白,没能搞得懂。[/quote] 请参考http://blog.csdn.net/q317379184/article/details/47781467
seeto 2015-08-19
  • 打赏
  • 举报
回复
引用 11 楼 q317379184 的回复:
[quote=引用 10 楼 seeto 的回复:] [quote=引用 9 楼 q317379184 的回复:] 创建快捷方式c#有自己的方法。为什么要调用其他的DLL
就是啊! 请问有没有例子程序?[/quote] http://www.cnblogs.com/08shiyan/archive/2011/09/29/2195633.html[/quote] 你的这个例子我已经看过了,就和上面有朋友说的一样,需要调用Interop.IWshRuntimeLibrary.dll,你发的链接的原文也说了: 缺点: 用这种方法写的程序,必须有Interop.IWshRuntimeLibrary.dll跟着, 链接中的第二种方法是调用一个vbs文件,也不是C#自己的方法。 C#自己的方法是我在8楼说的,百度百科查出来的C#中类似 CreateObject 的方法就是 System.Activator.CreateInstance. 后续的对象函数的调用可以通过InvokeMember方法来实现。可惜我C#只是小白,没能搞得懂。
random_2011 2015-08-19
  • 打赏
  • 举报
回复
引用 10 楼 seeto 的回复:
[quote=引用 9 楼 q317379184 的回复:] 创建快捷方式c#有自己的方法。为什么要调用其他的DLL
就是啊! 请问有没有例子程序?[/quote] http://www.cnblogs.com/08shiyan/archive/2011/09/29/2195633.html
crystal_lz 2015-08-18
  • 打赏
  • 举报
回复
引用 5 楼 crystal_lz 的回复:
如果我没有猜错的花 lnk 不也是文本文件吗。。
好吧 我说错了 lnk 并不是文本文件 看了一下他的文件格式 也不复杂 给你找了一片文章http://blog.csdn.net/testcs_dn/article/details/8674265 貌似你也可以 生成一个vbs脚本去执行。
crystal_lz 2015-08-18
  • 打赏
  • 举报
回复
如果我没有猜错的花 lnk 不也是文本文件吗。。
事理 2015-08-15
  • 打赏
  • 举报
回复
网上找下这个dll文件,Interop.IWshRuntimeLibrary.dll,添加到项目中

string desktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);//得到桌面文件夹
            //创建桌面快捷方式
            if (chkCreateDesktopLnk.Checked == true)
            {
                if (!File.Exists(desktopPath + "\\程序名称.lnk"))
                {
                    string target = Application.ExecutablePath;
                    IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShellClass();
                    IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(desktopPath + "\\程序名称.lnk");
                    shortcut.TargetPath = target;
                    shortcut.Arguments = "";// 参数
                    shortcut.Description = "程序描述信息";
                    shortcut.WorkingDirectory = Application.StartupPath;//程序所在文件夹,在快捷方式图标点击右键可以看到此属性
                    shortcut.IconLocation = target + ",0";//图标
                    //shortcut.Hotkey = "";//热键CTRL+SHIFT+Z
                    shortcut.WindowStyle = 1;
                    shortcut.Save();
                }
            }
            else
            {
                if (File.Exists(desktopPath + "\\程序名称.lnk"))
                    File.Delete(desktopPath + "\\程序名称.lnk");
            }
无涯大者 2015-08-15
  • 打赏
  • 举报
回复
报什么错, 是否缺少名门空间的引用?
seeto 2015-08-05
  • 打赏
  • 举报
回复
引用 1 楼 fengqingtao2008 的回复:
应该跟VB.NET 一样

// 直接调用COM对象

{
	object wsh = Interaction.CreateObject("WScript.Shell");
	string desk = wsh.SpecialFolders("Desktop");
	object lnk = wsh.CreateShortcut(desk + "\\说明2.lnk");

	var _with1 = lnk;
	_with1.Arguments = "/?";
	//传递参数
	_with1.Description = "我是直接调用COM创建的非托管对象创建的快捷方式!";
	_with1.Ic();
	//调用dll资源内的图标,索引在第23个图标,问号帮助
	_with1.TargetPath = Application.StartupPath + "\\乐博网.txt";
	_with1.WindowStyle = 7;
	//打开窗体的风格,最小化
	_with1.WorkingDirectory = Application.StartupPath;
	//工作路径
	_with1.Save();
	//保存快捷方式
}
VB.NET转C#
这样转是不行的,我早已试过了,那个网站也经常使用,这样转的话Interaction会报错。
无涯大者 2015-08-05
  • 打赏
  • 举报
回复
应该跟VB.NET 一样

// 直接调用COM对象

{
	object wsh = Interaction.CreateObject("WScript.Shell");
	string desk = wsh.SpecialFolders("Desktop");
	object lnk = wsh.CreateShortcut(desk + "\\说明2.lnk");

	var _with1 = lnk;
	_with1.Arguments = "/?";
	//传递参数
	_with1.Description = "我是直接调用COM创建的非托管对象创建的快捷方式!";
	_with1.Ic();
	//调用dll资源内的图标,索引在第23个图标,问号帮助
	_with1.TargetPath = Application.StartupPath + "\\乐博网.txt";
	_with1.WindowStyle = 7;
	//打开窗体的风格,最小化
	_with1.WorkingDirectory = Application.StartupPath;
	//工作路径
	_with1.Save();
	//保存快捷方式
}
VB.NET转C#

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧