繁体   English   中英

在 MacOS 上使用带有 .net 的 canon sdk

[英]Using canon sdk with .net on MacOS

我正在开发一个托管 signalR 集线器的 asp.net (.Net 5) 应用程序,以允许客户端使用官方佳能 sdk 与佳能相机进行通信(例如拍照、捕获视频和直播)。 它在 Windows 上完美运行。 但是,在 MacOS 上调用 c++ 库会导致死锁,除非调用主线程。 我能找到的只是 mac sdk 不是线程安全的,所以它应该在任何其他线程中使用。

例如,此代码有效:

class Program
{
    static void Main(string[] args)
    {
        SdkWrapper.EdsInitializeSDK();            
    }
}
static class SdkWrapper
{
    [DllImport("EDSDK")]
    public static extern int EdsInitializeSDK();
}

但是无论是在另一个线程上运行还是在异步等待上下文中,该函数都不会因为死锁而返回。

class Program
{
    static async Task Main(string[] args)
    {
        await Task.Run(SdkWrapper.EdsInitializeSDK);

        var thread = new Thread(() => SdkWrapper.EdsInitializeSDK());
        thread.Start();
    }
}
static class SdkWrapper
{
    [DllImport("EDSDK")]
    public static extern int EdsInitializeSDK();
}

因此,一种解决方法可能是在主线程中运行所有 sdk 函数调用(可能这是一个坏主意)。 有没有办法让它与asp.net一起工作?
或者有人知道在 MacOS 上使用带有 .net 的 canon sdk 的更好方法吗?

Canon SDK 在 Windows 上也不是线程安全的,到目前为止您一定很幸运还没有遇到问题。 Windows 和 macOS 的区别在于 SDK 能够在任何 (STA-) 线程上工作,但在 macOS 上它强制运行在主线程上。 总的来说,佳能 SDK 确实不适合在 Web 应用程序中使用。

我的建议是让相机代码在不同的进程中运行,并让网络应用程序通过 IPC(例如套接字、TCP 等)与它通信。

或者,如果您的相机与相机控制 API (CCAPI) 配合使用,我建议您这样做,因为您不需要使用 SDK 的困难,而只需向相机发送 HTTP 请求即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM