【问题标题】:Using canon sdk with .net on MacOS在 MacOS 上使用 canon sdk 和 .net
【发布时间】:2021-06-17 07:53:23
【问题描述】:

我正在开发一个托管 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 上将 canon sdk 与 .net 一起使用的更好方法吗?

【问题讨论】:

    标签: c# macos asp.net-core .net-core canon-sdk


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多