将命令行参数从VB传递到C#WPF应用程序

问题描述 投票:1回答:2

我有一个C#WPF应用程序,我希望能够从另一个现有的应用程序打开,该应用程序是用VB.net编写的。就c#应用程序而言,我想我知道如何获得以两种不同的方式传递给它的命令行参数,这是我在研究谷歌和使用其他人的答案时得到的。

App.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();
        }
    }

此方法每次只显示错误消息框,因为args为空。

我有一种感觉问题是当我尝试从VB.NET应用程序打开应用程序并将字符串参数从那里传递给c#app时。但是我没有关于如何从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

没有用;我添加了它们,希望shell执行会强制参数作为命令行参数。我也在VB中试过这个:第二个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

任何见解都会非常感激!谢谢。

c# wpf vb.net parameter-passing command-line-arguments
2个回答
1
投票

我看到你正在使用“\ Microsoft \ ChallengeHandler.appref-ms”。这是一个ClickOnce应用程序。获取ClickOnce应用程序的参数与普通应用程序完全不同。您需要使用ApplicationDeployment.CurrentDeployment.ActivationUri.Query和HttpUtility.ParseQueryString来检索它们。

我相信要将它们发送给您,必须使用“?param = value”将它们添加到启动网址。我只是尝试从网页上启动它,所以我不确定这是否有效。

您当前使用的方法对正常应用程序有效。如果你可以找到exe并直接启动它,你应该没问题。


1
投票

我创建了2个项目:Line命令C#invoker和WPF Test应用程序;

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并双击显示一个MessageBox,消息“e.Args为null”:

Application without parameters

但是如果我通过WPFInvoker打开WPFTest应用程序:

Application with parameter

最后我关闭了MessageBox和它显示的MainWindow.xaml。

© www.soinside.com 2019 - 2024. All rights reserved.