簡體   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