2010-01-25 11 views
6

Hmmm. Tamam, PInvoke'i tekrar gözden geçirdikten sonra, eminim ki tam olarak anlamadım: -/(az önce this question)Referans shell32 tekrar, C# Visual Studio

Kullanmam gereken kodu göstermeme izin verin. "Add Reference -> COM -> Microsoft Shell Controls ve Automatation" kullandığım zaman çalışıyor ... ama ne yazık ki projeme şöyle bir referans veriyor: "C: \ Users \ Tim \ Documents \ Visual Studio 2008 \ Projects \ Wing \ FileWing \ obj \ Debug \ Interop.Shell32.dll "

Geri dönüşüm kutusuyla kazıyorum ve kurtarmak istediğim bir öğe arıyorum. Bunu yapmak için PInvoke'la savaşmamanın bir yolu var mı? Ya da bu kodu çalışma zamanında kullanmama izin veren system32/shell32.dll dosyasına bir başvuru almak için?

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; 
    } 
} 

cevap

7

Şu anda 2 farklı konsepti karıştırıyorsunuz: PInvoke ve COM Interop.

PInvoke, yönetilen kodun içinden yerel C işlevlerine erişmenizi sağlar. Yönetilen kodda yerel yöntemin marshal uyumlu bir imzasını tanımlayarak ve DllImport özniteliğiyle işaretleyerek çalışır. Yerel DLL'ye bir meta veri başvurusu gerektirir ve olamaz. DLL, bir Win32 DLL için normal yükleme kuralları kullanılarak çalışma zamanında bulunur.

COM Interop, COM uyumlu nesnelere yönetilen koddan erişmenizi sağlar. Bu, COM arayüzünün marshal uyumlu yönetilen tanımının alınması ve daha sonra nesnenin çeşitli yollardan bir referans almasıyla yapılır. Yönetilen tanımlamayı elde etmek genellikle COM bileşeni için PIA (birincil birlikte çalışma derlemesi) için bir meta veri başvurusu ekleyerek gerçekleştirilir. C# 4.0'a kadar bu referans çok fazla iş olmaksızın kaldırılamaz ve uygulamanızla birlikte dağıtılmalıdır.

Bu özel örnekte, COM birlikte çalışma ve PInvoke kullanmıyorsunuz.

+0

İlk çıkış - özür dilerim, üniversiteyi bitirdim ve orada winapis öğretmiyorlar ;-) Tamam, bu yüzden COM birlikte çalışıyorum. Birlikte çalışma derlemesi için bir referansa ihtiyacım olduğunu söylüyorsunuz. Sanırım bu, benim için oldukça küçük ve tamam bu şeyler: .. \ Visual Studio 2008 \ Projects \ Wing \ FileWing \ obj \ Debug \ Interop.Shell32.dll Şimdi benim sorum: nasıl etkileyebilirim bu nesne oluşturulduğunda (bu nesnenin başka bir yolunun yolunu ayarlamak gibi) veya bu nesneyi nasıl önceden dağıtabilirim, bu yüzden uygulamam ile yüklü? – Akku

+0

@Tim, Nerede oluşturulduğunu etkileyebileceğine inanmıyorum. Yapı sistemi tarafından otomatik olarak yapılır. Dağıtmak için uygulamanızın hedef klasörüne kopyalayın. – JaredPar

+0

Teşekkürler! Bu tam olarak ne yapmam gerektiği :-) – Akku