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

Posted

技术标签:

【中文标题】将命令行参数从 VB 传递到 C# WPF 应用程序【英文标题】:Passing Command Line Arguments from VB to C# WPF Application 【发布时间】:2018-11-16 08:05:53 【问题描述】:

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

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# 应用程序时。但是我不知道如何从 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

任何见解将不胜感激!谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

是的,经过进一步研究,对于仅离线应用程序来说似乎相当困难。我将考虑一种不同的方式,或者现在不实现该功能。这不是必需的,我只是想让它变得健壮,以便可以在工厂位置之间使用。谢谢!【参考方案2】:

我创建了 2 个项目:行命令 C# 调用程序和 WPF 测试应用程序;

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”的 MessageBox:

Application without parameters

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

Application with parameter

最后我关闭了 MessageBox 和 MainWindow.xaml 。

【讨论】:

这是我调用可执行文件时的一个很好的例子。谢谢。

以上是关于将命令行参数从 VB 传递到 C# WPF 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

WPF命令行参数,一种聪明的方法?

wpf程序调用cmd命令行的方法(C#语言调用C++写的程序)?

WPF如何获取命令行参数

从带有命令行参数的批处理文件运行控制台应用程序,如何在运行时传递参数值? [复制]

将字符串或属性传递给 WPF Code Behind

显示从 ASP.NET MVC 中的命令行进程获取的数据