C# macurl方案

C# macurl方案,c#,macos,xamarin,monomac,xamarin.mac,C#,Macos,Xamarin,Monomac,Xamarin.mac,如何使用Xamarin.Mac设置和调试URL方案 我将以下内容添加到我的Info.plist: 然后我构建了一个安装程序包并安装了应用程序。但如果我在浏览器中打开mytest://或运行openmytest://命令行,两者都不会启动我的应用程序 另外,在运行mytest://之后,是否有方法在Xamarin Studio中附加调试器?在Windows上,我会使用Debugger.Break和Debugger.Attach,但这些方法似乎没有在Mono中实现。它并没有直接解决您的问题,但这个

如何使用Xamarin.Mac设置和调试URL方案

我将以下内容添加到我的
Info.plist

然后我构建了一个安装程序包并安装了应用程序。但如果我在浏览器中打开
mytest://
或运行
openmytest://
命令行,两者都不会启动我的应用程序


另外,在运行
mytest://
之后,是否有方法在Xamarin Studio中附加调试器?在Windows上,我会使用
Debugger.Break
Debugger.Attach
,但这些方法似乎没有在Mono中实现。

它并没有直接解决您的问题,但这个问题的答案对您有帮助吗

具体地说,它解决了在项目上使用自定义执行命令选项的问题。您可以定义自定义命令以在调试器中执行应用程序:

打开“项目选项”,进入“运行>自定义命令”部分,为“执行”添加自定义命令

它还提到调试器。中断行为:

如果您的应用程序在Mono 2.11或更高版本的Mono软调试器内运行[…],它将为软调试器设置一个软断点,并按预期工作


编辑:

你可以在已经运行的Mac应用程序上调用URL。。。您能否设置一个处理程序来捕获事件,在其中设置一个断点,并检查您的URL是否正确调用了已经运行的应用程序?它可能会为您提供行为的线索或进一步调试的方法。大概是这样的:

    public override void FinishedLaunching(NSObject notification)
    {
        NSAppleEventManager appleEventManager = NSAppleEventManager.SharedAppleEventManager;

        appleEventManager.SetEventHandler(this, new Selector("handleGetURLEvent:withReplyEvent:"), AEEventClass.Internet, AEEventID.GetUrl);
    }

    [Export("handleGetURLEvent:withReplyEvent:")]
    private void HandleGetURLEvent(NSAppleEventDescriptor descriptor, NSAppleEventDescriptor replyEvent)
    {
        // Breakpoint here, debug normally and *then* call your URL
    }

正如@TheNextman所发布的,该解决方案确实有效,但这是一个更完整的解决方案。我从Xamarin论坛获得了以下信息。正如用户(和Xamarin员工)Sebastien Pouliot(@poupou)所述

除了枚举值中的四个字符,我从未使用过那个特定的API 在Apple API中很常见

四个字符(4字节)被编译成一个整数。如果有 没有可用的C#枚举,然后可以将字符串转换为 此代码包含的整数:

public static int FourCC (string s) {
    return (((int)s [0]) << 24 |
        ((int)s [1]) << 16 |
        ((int)s [2]) << 8 |
        ((int)s [3]));
}
publicstaticintfourcc(字符串s){

返回(((int)s[0])我是通过运行
open/Applications/MyApp.app
来启动这个应用程序的,所以我尝试传递
--debug
,但是没有连接到调试器。我认为这里的复杂之处在于它是一个Mac应用程序,我打赌控制台应用程序可以正常工作。自定义命令的好处是,如果我觉得需要调试,我会使用它--我只需要获得custom URL方案首先起作用了,我想。谢谢,当应用程序已经打开时,它现在正在到达断点,但是如果应用程序还没有打开,它不会做任何事情。对此有什么想法吗?应用程序不能从URL启动吗?如果它到达断点,听起来好像设置正确。可能是LaunchServices的问题。你读过了吗s thread:?它有一些很好的信息,可能会有所帮助……我终于让它工作了,我相信url方案正在启动另一个无法启动的应用程序版本(立即崩溃)。在弄清楚这一点后,它按预期工作。
public override void FinishedLaunching(NSObject notification)
{
    NSAppleEventManager.SharedAppleEventManager.SetEventHandler(this, new Selector("handleGetURLEvent:withReplyEvent:"), AEEventClass.Internet, AEEventID.GetUrl);
}

[Export("handleGetURLEvent:withReplyEvent:")]
private void HandleGetURLEvent(NSAppleEventDescriptor descriptor, NSAppleEventDescriptor replyEvent)
{
    string keyDirectObject = "----";
    uint keyword = (((uint)keyDirectObject[0]) << 24 |
                   ((uint)keyDirectObject[1]) << 16 |
                   ((uint)keyDirectObject[2]) << 8 |
                   ((uint)keyDirectObject[3]));
    string urlString = descriptor.ParamDescriptorForKeyword(keyword).StringValue;
}