C#Visual Studio 2008对system32.dll的引用……怎么样?

我需要参考system32 / shell32.dll,因为我使用一些shell函数来读出回收站。 我尝试了“添加引用 – > COM – > Microsoft Shell控件和自动化”和“添加引用 – >浏览—> [直接转到system32 / shell32.dll]。两者都添加了shell32引用到我的引用但是当我查看属性时,我看到引用的路径如下所示:“C:\ Users \ Tim \ Documents \ Visual Studio 2008 \ Projects \ Wing \ FileWing \ obj \ Debug \ Interop.Shell32.dll” …

我不会将此\ obj \ Debug \ path部署到我的安装程序。 那么如何直接引用最终用户shell32.dll呢? 有办法吗? 为什么VS2008会创建这条奇怪的路径? 我可以更改此路径,以便它不会位于此奇怪的子文件夹中吗?


嗯。 好的,重新访问PInvoke后,我确信我不太明白: – /

让我举例说明我需要处理的代码。 我正在挖掘回收箱并寻找我想要恢复的物品。 有没有办法不通过PInvoke进行战斗来完成这项工作?

private void recoverRecyclerBinEntry(string fileName, int size) { try { Shell Shl = new Shell(); Folder Recycler = Shl.NameSpace(10); // scans through all the recyclers entries till the one to recover has been found for (int i = 0; i < Recycler.Items().Count; i++) { FolderItem FI = Recycler.Items().Item(i); string FileName = Recycler.GetDetailsOf(FI, 0); if (Path.GetExtension(FileName) == "") FileName += Path.GetExtension(FI.Path); //Necessary for systems with hidden file extensions. string FilePath = Recycler.GetDetailsOf(FI, 1); string combinedPath = Path.Combine(FilePath, FileName); if (size == FI.Size && fileName == combinedPath) { Debug.Write("Match found. Restoring " + combinedPath + "..."); Undelete(FI); Debug.WriteLine("done."); } else { Debug.WriteLine("No match"); } } } catch (Exception ex) { Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace); } } private bool Undelete(FolderItem Item) { try { foreach (FolderItemVerb FIVerb in Item.Verbs()) { if ( (FIVerb.Name.ToUpper().Contains("WIEDERHERSTELLEN")) || (FIVerb.Name.ToUpper().Contains("ESTORE")) || (FIVerb.Name.ToUpper().Contains("NDELETE")) ) { FIVerb.DoIt(); return true; } } //execute the first one: Item.Verbs().Item(0).DoIt(); return true; } catch (Exception) { Debug.WriteLine("ERROR undeleting"); return false; } } 

我相信你正在寻找P / Invoke(平台调用)

一旦获得了包含和使用DLL的方法,您可以访问pinvoke.net以获取使用某些方法的特定代码片段。

您是否只是使用DllImport来访问shell32 / kernel32中的function? 如果是这样,您不需要添加引用。

例如:

 [DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] public static extern bool MoveFile(String src, String dst); 

这是一个使用平台调用的教程,这是一篇MSDN 文章 。

使用VS 2008添加dll引用后,可以打开.dll的属性。

确保将Copy Local设置为True。

如果这不起作用,另一个解决方案是将.dll作为项目添加到项目中,并将make作为内容,并告诉它复制到输出目录。