Это приложение не может быть запущено. Только когда файл находится в каталоге system32

Я написал небольшую программку, которая скачивает файл из интернета, то есть не более того. Мои намерения состоят в том, чтобы использовать его через командную строку... Он отлично работает, но когда я помещаю его в C:\Windows\System32\, чтобы фактически использовать его везде, где я хочу, он не работает сейчас... Это не помогло. t выдает исключение... он просто показывает мне это окно сообщений - http://i.imgur.com/a7rlMgo.png и если я нажму "Да", в браузере откроется эта страница - http://support.microsoft.com/kb/2715633/en-us

Что я должен сделать, чтобы заставить его работать?

Код, если он имеет какое-либо значение.. :

private const string InsufficientParametersMessage = "Insufficient Parameters...";

private static string[] _arguments;

static void Main(string[] args)
{
    _arguments = args;

    TakeCommand();

    Environment.Exit(0);
}

private static void TakeCommand()
{
    if (_arguments.Length < 1)
    {
        Console.WriteLine(InsufficientParametersMessage);
    }
    else if (_arguments.Length == 1)
    {
        DownloadFile(_arguments[0]);
    }
    else if (_arguments.Length > 1)
    {
        DownloadFile(_arguments[0], _arguments[1]);
    }
}

private static void DownloadFile(string url)
{
    DownloadFile(url, Path.GetFileName(url));
}

private static void DownloadFile(string url, string localFileName)
{
    WebClient client = new WebClient();

    if (File.Exists(localFileName))
    {
        File.Delete(localFileName);
    }

    try
    {
        client.DownloadFile(url, localFileName);
        Console.WriteLine("Done...");
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception.Message);
    }
}

person kendos    schedule 13.08.2013    source источник
comment
Приложение не настроено таким образом, чтобы можно было определить подходящую версию среды выполнения .NET Framework. -- На какую версию среды выполнения вы ориентируетесь в Visual Studio?   -  person Robert Harvey    schedule 13.08.2013
comment
i.imgur.com/247913M.png   -  person kendos    schedule 13.08.2013
comment
i.imgur.com/XLpjGXF.png это помогает?   -  person kendos    schedule 13.08.2013
comment
Установлен ли в системе .NET 4.5?   -  person Reed Copsey    schedule 13.08.2013
comment
Он установлен, это система, на которой я разрабатываю... меня беспокоит, что он отлично работает везде, кроме system32... Вы ориентируетесь на 64-битную или 32-битную? Мне все равно... Я просто хочу, чтобы это работало..   -  person kendos    schedule 13.08.2013
comment
Вы пробовали запускать приложение от имени администратора?   -  person JeremiahDotNet    schedule 13.08.2013
comment
Да, это не имело значения.   -  person kendos    schedule 13.08.2013


Ответы (5)


Короткий ответ: снимите флажок "Предпочитать 32-разрядную версию".

Длинный ответ: (не уверен на 100%, но вот)

Предполагая, что у вас 64-битная машина, имейте в виду, что System32 — это папка, зарезервированная для использования 64-битных приложений, и, хотя это может показаться странным, SysWOW64 содержит 32-битные DLL и зарезервирована для 32-битных приложений. Как правило, 32-разрядные приложения, обращающиеся к System32, проходят через перенаправитель файловой системы в папку SysWOW64. Подробнее здесь.

Однако, когда ваше приложение (которое работает как 32-разрядный процесс) работает в самой System32, перенаправитель, вероятно, ничего не делает, потому что считает, что в перенаправлении нет необходимости, поэтому ваше приложение работает вне System32, но не внутри него.

Поэтому, чтобы решить эту проблему, снимите флажок Предпочитать 32-разрядную версию, чтобы приложение попыталось настроить таргетинг на 64-разрядную платформу... или еще лучше, поместите приложение в другое место и добавьте каталог приложения в переменную пути среды. Таким образом, вы по-прежнему можете получить доступ к своему .exe-файлу приложения в любом месте, и он не загрязнит вашу папку System32, которая в любом случае должна использоваться только для файлов Windows.

person gitsitgo    schedule 13.08.2013
comment
отлично .. поместите приложение в другое место и добавьте его в переменную пути среды, которая сработала для меня .. - person droidbot; 27.05.2016
comment
Для тех, кто еще не знает: свойство «Предпочитать 32-разрядную версию» находится на вкладке «Сборка» страницы свойств проекта в Visual Studio. - person Jim Reineri; 14.10.2016
comment
Я решил эту проблему, скопировав в папку System32 и SystemWOW64 исполняемый файл. Если флажок «Предпочитать 32 бита» не установлен, приложение будет смотреть только внутри папки SystemWOW64. - person Tore Aurstad; 27.08.2019

Этот ответ может быть неприменим к проблеме ОП (которая в любом случае была решена), но, возможно, для других, которые попадают сюда из-за поиска «Это приложение не может быть запущено» и System32. В моем случае я написал заставку программа на С#, которая должна была работать в 32-разрядной версии, и решение состояло в том, чтобы установить ее в каталог Windows, а не в Windows\System32.Тогда она работает нормально как в 32-, так и в 64-разрядных системах.

person RenniePet    schedule 06.08.2014

Если вы поместите свой 32-разрядный исполняемый файл как в папку System32, так и в папку SysWOW64. Это работает просто отлично. Не одну, не другую, а обе папки.

Это может показаться странным, но попробуйте. Если вы поместите один и тот же exe в обе папки, он запустится без каких-либо изменений.

person David    schedule 19.02.2015
comment
Это похоже на ответ на вопрос, отличный от того, что задал ОП. - person ; 19.02.2015
comment
ОП пытался поместить свое приложение командной строки. Я намерен использовать его через командную строку. это просто показать мне это окно сообщений. Он получает это сообщение, потому что его приложения нет в папке SysWOW64. Если он также положит свое приложение в эту папку. Это будет работать. Он получит не «Это приложение не может быть запущено». сообщение об ошибке. Это решение его проблемы и ответ на его вопрос. - person David; 20.02.2015
comment
Ваш ответ касается других приложений, которые находят указанную программу. Одни смотрят в System32, другие смотрят в SysWOW64, так вот ты и ставишь в оба, чтобы все приложения его находили. Но тут вопрос про программу, которая хоть и найдена, но не может быть запущена. - person ; 20.02.2015
comment
Да. Это та же проблема, что и у меня с NuGet.exe. Если вы поместите NuGet.exe в System32, вы получите точно такое же сообщение об ошибке «Это приложение не может быть запущено». Если вы поместите NuGet.exe как в System32, так и в SysWOW64, он будет работать. Если вы поместите его в System32, вы получите сообщение об ошибке. Если вы поместите его в SysWOW64, Windows его не найдет. Если поместить его в обе директории без каких-либо изменений в exe. Это будет работать! Нет, у него нет проблемы с NuGet.exe. Но это точно такая же проблема и ответ на вопрос OP: что мне делать, чтобы заставить его работать? - person David; 20.02.2015
comment
Ах, хорошо, это не было ясно из вашего ответа. Мне кажется маловероятным, что это действительно так, кажется, что какое-то тестирование пошло не так, но я не могу проверить себя прямо сейчас, и если вы правильно провели тестирование, тогда я согласен, тогда ваш ответ совершенно верен. - person ; 20.02.2015
comment
Спасибо! Я знаю, это звучит странно, поэтому я назвал это магией. Я только что протестировал его на чистом сервере Win 2012. Если положить свой exe в обе папки, то работает! - person David; 20.02.2015
comment
Я попытался прояснить это странное поведение Win64 в своем ответе. - person David; 20.02.2015
comment
Это связано с перенаправлением файловой системы. По сути, 64-битные процессы отправляются в System32 для обратной совместимости, в то время как 32-битные процессы молча перенаправляются в SysWow64, даже не подозревая об этом. В Sytstem32 теперь хранятся 64-битные файлы, а в SysWow64 — 32-битные. При попытке выполнить 32-разрядное приложение в 64-разрядной системе может возникнуть путаница, поскольку приложение не знает об архитектуре, на которой оно работает. Запуск 32-битного приложения в System32 может быть проблематичным. - person Shrout1; 22.08.2018

Я только что переместил NuGet.exe из c:\Windows\System32 в c:\Windows, и он работает.

person Jiří Herník    schedule 04.08.2017

Возможно, этот ответ не применим напрямую к ответу OP, но наверняка он связан и решил мою проблему.
На моем рабочем компьютере у меня есть несколько папок, которые автоматически синхронизируются с OneDrive. Эти файлы постоянно помечаются как «Рабочие», а не «Личные».
Каждый раз, когда я копирую между этими папками, которые синхронизируются, я не могу запустить свое разработанное приложение. Когда я создал новый каталог, помимо папок синхронизации, я смог изменить права собственности на файлы на личные (см. ниже):
введите здесь описание изображения

Только после этого моя программа работает отлично.

person Marcin    schedule 22.10.2020