Ссылка на C # Visual Studio 2008 system32.dll … каким образом?

StackOverflow https://stackoverflow.com/questions/2133346

  •  22-09-2019
  •  | 
  •  

Вопрос

Мне нужна ссылка system32/shell32.dll поскольку я использую некоторые функции оболочки для считывания содержимого корзины.Я попробовал "Добавить ссылку -> COM -> Элементы управления и автоматизации Microsoft Shell" и "Добавить ссылку -> Обзор ---> [переход непосредственно к system32/shell32.dll].Оба добавляют ссылку shell32 к моим ссылкам.Но когда я смотрю на свойства, я вижу, что путь к ссылке выглядит следующим образом:"C:\Users im\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?Если это так, то вам не нужно добавлять ссылку.

Например:

[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 Статья.

После добавления ссылки на dll с помощью VS 2008 вы можете открыть свойства для .dll.

Убедитесь, что для параметра Copy Local установлено значение True.

Если это не сработает, другое решение - добавить .dll в качестве элемента в ваш проект, а make - в качестве содержимого, и указать ему скопировать в выходной каталог.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top