我的申请仅适用于我和同事,所以我不在乎它是Click-Once还是copy-the-exe。我希望能够在Windows资源管理器中单击具有给定扩展名的文件,并启动我的程序并打开该文件。我无法捕获文件名。
表面解决方案:
我正在尝试的代码如下所示,此时我想要做的就是将单击文件的名称放在文本框中。我怀疑我的相关无知是关于如何从Windows资源管理器引用click-once应用程序。当我构建时,我最终得到了一个名为setup.exe的文件,一个名为Wis.application的文件,当我点击“setup”进行安装时,我最终得到了一个“Click-once application reference”类型的快捷方式。 C:\ Users \ ptom \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Wis“。我尝试将文件与安装创建的快捷方式相关联,并将文件与setup.exe相关联。当我单击该文件时,应用程序启动但指示 AppDomain.CurrentDomain.SetupInformation.ActivationArguments为null。 (通过“表示”我的意思是文本框中填入了我测试的文本以查看它是否为空)。如果我从调试运行应用程序,或者只是从开始菜单运行它,它会按照指示ActivationArguments不为null的代码路径执行我所期望的,但它的ActivationData(string [])是长度的0.
以下是app.xaml.cs的代码
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace Wis
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// Check if this was launched by double-clicking a doc. If so, use that as the
// startup file name.
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null)
{
this.Properties["DoubleClickedFileToLoad"] = "There were no activation arguments AGAIN";
}
else
{
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null
&& AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0)
{
this.Properties["DoubleClickedFileToLoad"] =
AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
}
else
{
this.Properties["DoubleClickedFileToLoad"] = "Type in a file name";
}
}
}
}
}
由于
答案 0 :(得分:3)
您检查过Environment.GetCommandLineArgs()
吗?
这显示了启动应用程序的参数。
如果您的应用程序与文件关联,则应将文件名作为参数之一。
答案 1 :(得分:3)
首先,您应该为ClickOnce-publish添加文件关联(选择项目 - &gt;属性 - &gt;发布选项 - &gt;文件关联)
然后添加对“ System.Deployment ”的引用
然后你可以用这种方式在App.cs中提取路径,具体取决于启动类型(ClickOnce或Local)
protected override void OnStartup(System.Windows.StartupEventArgs e)
{
var path = GetPath (e);
}
private static string GetPath(StartupEventArgs e)
{
if (!ApplicationDeployment.IsNetworkDeployed)
return e.Args.Length != 0 ? e.Args[0] : null;
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null)
return null;
var args = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
return args == null || args.Length == 0 ? null : new Uri(args[0]).LocalPath;
}