Передача аргументов командной строки из VB в приложение CF WPF - PullRequest
0 голосов
/ 06 июня 2018

У меня есть приложение C # WPF, которое я хочу открыть из другого существующего приложения, написанного на VB.net.Что касается приложения c #, я думаю, что я знаю, как получить параметры командной строки, которые передаются ему двумя различными способами, которые я получил, исследуя Google и используя ответы других.

Приложение.Заголовок xaml

<Application x:Class="ChallengeHandler.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:ChallengeHandler"
         Startup="Application_Startup">

App.xaml.cs Метод 1

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        string[] args = Environment.GetCommandLineArgs();
        if (args.Length < 1)
        {
            MessageBox.Show("No parameter provided. Failed to run.");
            Shutdown();
        }
        else
        {
            MainWindow wnd = new MainWindow(args[0]);
            wnd.Show();
        }
    }

Приведенный выше метод приведет к открытию приложения, но не к данным, который опирается на параметр, заполняется.Таким образом, выпадающие списки и прочее в представлениях просто пусты.Это не помогло.

App.xaml.cs Метод 2

    private void Application_Startup(object sender, StartupEventArgs e)
    {

        if (e.Args.Length < 1)
        {
            MessageBox.Show("No parameter provided. Failed to run.");
            Shutdown();
        }
        else
        {
            MainWindow wnd = new MainWindow(e.Args[0]);
            wnd.Show();
        }
    }

Этот метод просто показывает сообщение об ошибке каждый раз, так как аргументы пусты.

У меня такое чувство, что проблема в том, что я пытаюсь открыть приложение из приложения VB.NET и передать оттуда строковый параметр в приложение c #.Но у меня нет идей о том, как передать строку, подобную параметру командной строки, из кода VB.net. Вызов из приложения VB.net

    Dim sPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Programs) + "\Microsoft\ChallengeHandler.appref-ms"
    Dim pHelp As New ProcessStartInfo

    If System.IO.File.Exists(sPath) Then
        pHelp.FileName = sPath
        pHelp.Arguments = "097"
        pHelp.UseShellExecute = True
        pHelp.WindowStyle = ProcessWindowStyle.Normal
        Dim proc As Process = Process.Start(pHelp)
    End If

Я пробовал код VB без

pHelp.UseShellExecute = True
pHelp.WindowStyle = ProcessWindowStyle.Normal

безрезультатно;Я добавил их в надежде, что выполнение оболочки вызовет параметры как параметры командной строки.Я также попробовал это в VB: 2-й метод VB

    Dim sPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Programs) + "\Microsoft\ChallengeHandler.appref-ms"
    If System.IO.File.Exists(sPath) Then
        System.Diagnostics.Process.Start(sPath, "097")
    End If

Любое понимание будет с благодарностью!Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я создал 2 проекта: командную строку C # invoker и приложение WPF Test;

Код invoker на Program.cs:

    namespace WPFInvoker
    {
        class Program
        {
            static void Main(string[] args)
            {
                Process.Start(@"C:\Users\...\bin\Debug\WPF_Test.exe", "example_parameter");
            }
        }
    }

Затем в WPF App.xaml у меня естьсобытие запуска app_Startup и основная форма MainWindow.xaml:

    <Application x:Class="WPF_Test.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:WPF_Test"
         Startup="app_Startup"
         StartupUri="MainWindow.xaml">
        <Application.Resources>

        </Application.Resources>
    </Application>

И код App.xaml.cs:

    namespace WPF_Test
    {
        /// <summary>
        /// Interaction logic for App.xaml
        /// </summary>
        public partial class App : Application
        {
            void app_Startup(object sender, StartupEventArgs e)
            {
                if (e.Args != null && e.Args.Length > 0)
                {
                    MessageBox.Show(e.Args[0]);
                }
                else
                {
                    MessageBox.Show("e.Args is null");
                }
            }
        }
    }

Когда я открываю WPFTest.exe с двойнымПри щелчке отображается блок сообщений с сообщением «e.Args is null»:

Приложение без параметров

Но если я открою приложение WPFTest через WPFInvoker:

Приложение с параметром

Наконец, я закрываю MessageBox и MainWindow.xaml, как показано.

0 голосов
/ 06 июня 2018

Я вижу, вы используете "\ Microsoft \ ChallengeHandler.appref-ms".Это приложение ClickOnce.Получение параметров для приложения ClickOnce полностью отличается от обычного приложения.Вам нужно использовать ApplicationDeployment.CurrentDeployment.ActivationUri.Query и HttpUtility.ParseQueryString для их извлечения.

Я полагаю, что для их отправки вам необходимо добавить их в URL-адрес запуска с помощью "? Param = value",Я только попытался запустить его с веб-страницы, поэтому я не уверен, так ли это работает.

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

...