title: C# Visual Studio 2008 Reference to system32.dll ... how?
body: <p>I need the reference system32/shell32.dll as I use some shell functions to read out the recycling bin. I tried "Add Reference --> COM --> Microsoft Shell Controls and Automatation" and "Add Reference --> Browse ---> [going to the system32/shell32.dll directly]. Both adds the shell32 reference to my references. But when I look at the properties, I see the path of the reference looks like this: "C:\Users\Tim\Documents\Visual Studio 2008\Projects\Wing\FileWing\obj\Debug\Interop.Shell32.dll" ... </p>
  
  <p>I'll not deploy this \obj\Debug\ path to my installer. So how can I reference the end-users shell32.dll directly? Is there a way? Why does VS2008 create this strange path? Can I change this path so it doesn't sit in this strange subfolder?</p>
  
  <hr>
  
  <p>Hmmm. Okay after revisiting PInvoke, I'm sure that I don't quite get it :-/</p>
  
  <p>Let me illustrate the code I need to handle. I'm digging though the recycling bin and seek for a item that I want to recover. Is there any way NOT fighting though the PInvoke to get this done? </p>
  
  <pre><code>    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 &lt; 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 &amp;&amp; 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;
          }
      }
  </code></pre>