VB.NET CommanLineArgs не передается из связанного типа файла

У меня есть одноэкземплярное приложение clickOnce winFrom с соответствующим типом файла.

когда я запускаю приложение в режиме отладки и вручную ввожу аргументы командной строки через настройки отладки, все работает так, как ожидалось. Файл, указанный в аргументах отладки, обрабатывается, и все идет по плану.

Когда я дважды щелкаю связанный тип файла (либо в режиме отладки, либо в реальном времени), аргумент командной строки (%1) по какой-то причине не передается приложению. Его просто нет.
У меня есть расширение файла, установленное в моей публикации > параметры > ассоциации файлов. У меня есть записи реестра следующим образом:

rundll32.exe dfshim.dll, ShOpenVerbExtension {c0a5ac53-477c-4f76-bfc7-aa99e87cbe21} %1

Это действительно открывает приложение при двойном щелчке файла. единственное, чего не хватает, это имя отправляемого файла (для открытия и обработки).

Любые идеи, что может привести к чему-то подобному?

РЕДАКТИРОВАТЬ: может быть важно отметить, что файл является просто сериализованным объектом. Цель состоит в том, чтобы десериализовать и обработать объект после двойного щелчка по файлу. Логика для этого уже существует и работает, когда я использую аргумент командной строки отладки.

Environment.GetCommandLineArgs() возвращает только путь к исполняемому файлу в (0).

My.Application.CommandLineArgs.count = 0


person stevo22    schedule 10.02.2015    source источник
comment
На всякий случай: я проверяю аргументы двумя способами: environment.getcommandlineargs() И My.Application.CommandLineArgs.   -  person stevo22    schedule 10.02.2015
comment
Когда вы говорите, что Его просто нет, вы имеете в виду, что не получаете никаких аргументов. Или то, что вы ожидаете, не происходит... и, возможно, вы получаете аргументы, но не то, что вы ожидаете получить, и, следовательно, то, что вы ожидаете, не происходит?   -  person aphoria    schedule 10.02.2015
comment
Извините, что не включил эту ясность. В моем предыдущем комментарии я перечислил два метода получения аргументов. Я не вижу никаких аргументов в этих переменных в событиях моего приложения для запуска или startupNextInstance. командаlineargs.count = 0.   -  person stevo22    schedule 10.02.2015


Ответы (2)


Обновлять

Взгляните на эту ссылку, WPF: поддержка аргументов командной строки и расширений файлов. Код там C#, но я думаю, что его должно быть просто продублировать в VB.

Запуск с помощью двойного щелчка по пользовательскому типу файла.

Я создал приложение, которое поддерживает пользовательский формат документа, и мне нужно было дважды щелкнуть этот документ, чтобы открыть мое приложение. Я предполагал, что приложение откроется нормально с документом, представленным в виде аргумента командной строки, но это не так. Вместо этого он хранится в следующей скороговорке:

AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]
person aphoria    schedule 10.02.2015
comment
Я скопировал это прямо из моего типа файла в реестре. Он был добавлен автоматически через VS, когда я связал тип файла... Я предполагаю, что ShOpenVerbExtention сопоставляется с правильным файлом (он соответствует моему GUID в реестре), и он действительно открывает программу, когда я дважды щелкаю ассоциированный файл. и %1 (из того, что я читаю) указывает расположение имени файла, также известного как arg - person stevo22; 10.02.2015
comment
Поскольку программа открывается, я предполагаю, что DLL и точка входа верны, поскольку она выполняется, как и ожидалось. правильно ли% 1? может быть что-то в настройках моего приложения блокирует аргументы, передаваемые в программу? - person stevo22; 10.02.2015
comment
В каком разделе реестра находится эта командная строка? Вы уверены, что эта команда выполняется, когда вы дважды щелкаете файл этого типа? - person aphoria; 10.02.2015
comment
Он находится под именем приложения › shell › open › command › default REG_SZ (тип). Согласно моим исследованиям, это команда, выдаваемая при активации связанного файла (двойной щелчок). когда я вставляю информацию (удаляя% 1) в «выполнить», она запускает программу, как и ожидалось. - person stevo22; 10.02.2015
comment
Что произойдет, если вы вставите команду в поле «Выполнить», а также укажете путь и имя файла, который будет параметром, а затем запустите ее? - person aphoria; 11.02.2015
comment
Приложение запускается, но файл не обрабатывается. Я подключился к процессу и повторил попытку через запуск, и он не попал в мои точки останова в событиях моего приложения (запуск и запуск следующего экземпляра). - person stevo22; 11.02.2015
comment
Может быть, rundll32.exe dfshim.dll, ShOpenVerbExtension {c0a5ac53-477c-4f76-bfc7-aa99e87cbe21} %1 находит другую версию или копию файла, чем вы думаете? Можете ли вы попробовать указать полный путь или убедиться, что в другой папке есть разные версии, в частности, папка в системе PATH. - person aphoria; 11.02.2015
comment
Я хотел сказать, убедитесь, что не разные версии.... - person aphoria; 11.02.2015
comment
Я действительно не знаю, должен ли я указывать путь к экземпляру сервера для файла *.exe или для файла clickOnce *.application. Я пробовал оба, и вообще ничего не произошло. - person stevo22; 11.02.2015
comment
@ stevo22 После некоторых исследований я изменил свой ответ ... взгляните. - person aphoria; 11.02.2015
comment
Я на самом деле наткнулся на эту конкретную страницу ранее. Объект ActivationArguments не задан (ничего). На самом деле я не могу проверить событие запуска, так как я не могу достаточно быстро подключиться к процессу, чтобы поймать его... но в startupNextInstance ActivationArguments имеет значение Nothing. :( - person stevo22; 12.02.2015
comment
@stevo22 Может что-то в этом вопросе/ответе поможет? stackoverflow.com/questions/4233915/. - person aphoria; 12.02.2015
comment
В настоящее время я импортировал System.Deployment в пространство имен My - person stevo22; 12.02.2015
comment
Вы можете добавить это в свой стартовый скрипт: System.Diagnostics.Debugger.Launch() Это заставит приложение попросить вас подключить отладчик. Если вы добавите Debugger.Break() в следующей строке, он будет ждать, пока ваш отладчик не будет подключен, и вы нажмете «Продолжить». - person thorkia; 12.02.2015

В программе - страница свойств - в разделе «Публикация» - кнопка «Параметры». Вы выбрали «Ассоциации файлов», скажем, .mp3 или что-то еще. ЭТО заставляет программу открываться библиотекой поддержки развертывания приложений ClickOnce, а не вашей программой напрямую!

Если вы удалите это и вручную выберете ассоциации файлов, щелкните файл правой кнопкой мыши и выберите «Открыть с помощью -» и используйте по умолчанию, тогда параметр %1 в commandlineargs будет там.

В качестве альтернативы, если вы не хотите, чтобы пользователь делал это. Вам нужно получить аргументы командной строки в другом месте — из AppDomain. Следующий код позволит вам перетаскивать несколько файлов в ваше приложение или делать двойной щелчок.

    Dim strcmdLineArguments() as String = Environment.GetCommandLineArgs
    If AppDomain.CurrentDomain.SetupInformation.ActivationArguments IsNot Nothing Then
        Dim addInfo() As String = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
        i = strcmdLineArguments.Length
        ReDim Preserve strcmdLineArguments(i + addInfo.Length - 1)
        For j = 0 To addInfo.Length - 1
            strcmdLineArguments(i + j) = addInfo(j)
        Next
    End If

это должно помочь, и ваши strcmdlinearguments должны иметь то, что вы хотите. Забыл добавить, 0-й элемент по-прежнему будет местоположением вашей программы.

person Georg    schedule 01.12.2018