【问题标题】:C# CF: How to open specific file extension with my programC# CF:如何使用我的程序打开特定的文件扩展名
【发布时间】:2015-08-10 23:10:22
【问题描述】:

我正在使用 .Net Compact Framework 开发移动应用程序。 我设法编辑了注册表 HKEY_CLASSES_ROOT,以便单击扩展名为 .xyz 的文件将打开我的应用程序。基本上,我需要在点击这个文件时对其进行一些操作。

但是,我意识到如果我第一次这样做,它会到达 program.cs static void Main。但是当程序运行时,我再次单击扩展名为 .xyz 的文件,它不会加载程序static void Main。我尝试在当前正在运行的表单上设置断点,但仍然没有。

那么它去哪里了?如何检测文件 .xyz 被点击并执行某些操作?

【问题讨论】:

    标签: c# compact-framework


    【解决方案1】:

    您遇到的最大问题是,一旦应用程序运行,Main 将永远不会被再次调用,事实上它不应该。

    不幸的是,在 Windows Mobile 下,CF 本身会尝试保持应用程序单例,因此当您尝试再次运行该应用程序时,CLR 本身会拦截该应用程序并将现有实例置于首位。不幸的副作用之一是您没有机会处理命令行参数。

    要让它发挥作用,您必须做几件事:

    1. Subvert the CF's attempt to make your app a sinlgeton 这样您可以运行多个实例。
    2. 在应用程序中保存一个互斥锁以了解您是否已经在运行。
    3. 尽早产生一个线程来监听来自后续实例的传入参数。当参数进来时,把自己放在首位并妥善处理参数。
    4. 在启动时,如果已使用互斥锁(即应用程序已在运行),则使用 IPC(点对点队列是一种好方法)发送现有应用程序的侦听器线程(参见 #3)您的参数然后退出。

    【讨论】:

    • #1 是一个很棒的技巧,也是对幕后发生的事情的一个很好的解释。我很高兴我的同事从未读过那篇文章,因为他们喜欢任何改变应用程序预期行为的东西。 :)
    【解决方案2】:

    您说每次单击文件时都需要对文件执行一些操作。我假设这是与 GUI 相关的东西,比如你想在双击文件时显示文件的属性。

    假设您的程序有一个主窗体,您可以将其MinimizeBox 属性设置为false,并在其Deactivate 事件中设置this.Close();。这样,当您单击正确类型的文件时,您的应用程序将启动并读取命令行参数并显示文件详细信息。如果用户随后使用右上角的 OK 按钮关闭您的应用程序,它将真正关闭,以便下次打开时将打开一个新实例并正确读取命令行参数。或者,如果用户只是导航到 WinMo 中的某个其他程序,您的应用程序的 Deactivate 事件将触发,关闭应用程序。无论哪种方式,应用程序始终处于打开状态并位于顶部,或者完全关闭,因此在文件资源管理器中单击文件将始终打开一个新实例。

    【讨论】:

    • 跳出框框思考。做得好(尽管由于 CF 中的启动时间,我不想关闭它)。
    • @ctacke:谢谢,也感谢有机会使用我最近最喜欢的笑话:“我没有跳出框框思考,我只是有一个更大的盒子。” :)
    【解决方案3】:

    你在 Main 中有字符串 args 吗?

    static void Main(string[] args)
    

    【讨论】:

    • 您好,感谢您的快速回复。我通过转换允许命令行参数:static void Main() { Application.Run(new Main()); } 到这个static void Main(String[] args) { if (args.Length != 0) MessageBox.Show("Array len != 0"); else MessageBox.Show("Array len = 0"); Application.Run(new Main()); } 但是当程序运行并且我打开一个 .xyz 文件扩展名时,它根本不会到达 main。
    • 嗯,是的,这可能很难。如果程序正在运行,您能否将文件拖放到程序中(stackoverflow.com/questions/68598/…)。我知道那可能不是首选。
    • 只有在程序未运行并首次启动时才到达 Main(String[] args)。当我的程序以其形式和所有形式运行时,当我单击文件时,它只会打开我当前正在运行的形式(例如:设置形式)。我不确定这是否是正确的方法。使用我的主程序来处理这个操作。基本上我的主程序具有所有的 GUI 和其他功能。
    • erm 如何将文件拖放到移动应用程序中?
    • 嘿 SwDevMan81,我正在考虑创建一个额外的 .exe 文件来处理这个操作。基本上,我目前的解决方案有几个项目。 1.主项目有形式,基本上什么都有。 2. 我将转换为 dll 并作为参考输入到我的主项目中的一些其他项目,所以我正在考虑添加一个额外的项目来处理这个操作。但是我如何在安装过程中生成两个单独的 .exe 文件?或者我如何将信息从 one.exe 传递到 two.exe 好吧,我现在可能很困惑。
    【解决方案4】:

    您的问题是您正在寻找要再次调用的static void Main,即Static Constructor。静态构造函数只被调用一次。它们在类(在这种情况下是您的程序)被初始化之前被调用,然后再也不会被调用。程序的每个新实例都不会调用它们。

    【讨论】:

    • 这不会被调用,因为应用程序已经在运行。
    • 好点。我认为它会被视为一个类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多